package com.tangem.lib.visa;

import org.web3j.abi.EventEncoder;
import org.web3j.abi.FunctionEncoder;
import org.web3j.abi.TypeReference;
import org.web3j.abi.datatypes.*;
import org.web3j.abi.datatypes.generated.*;
import org.web3j.crypto.Credentials;
import org.web3j.protocol.Web3j;
import org.web3j.protocol.core.DefaultBlockParameter;
import org.web3j.protocol.core.RemoteCall;
import org.web3j.protocol.core.RemoteFunctionCall;
import org.web3j.protocol.core.methods.request.EthFilter;
import org.web3j.protocol.core.methods.response.BaseEventResponse;
import org.web3j.protocol.core.methods.response.Log;
import org.web3j.protocol.core.methods.response.TransactionReceipt;
import org.web3j.tuples.generated.Tuple3;
import org.web3j.tuples.generated.Tuple7;
import org.web3j.tx.Contract;
import org.web3j.tx.TransactionManager;
import org.web3j.tx.gas.ContractGasProvider;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.Callable;

import io.reactivex.Flowable;

/**
 * <p>Auto generated code.
 * <p><strong>Do not modify!</strong>
 * <p>Please use the <a href="https://docs.web3j.io/command_line.html">web3j command line tools</a>,
 * or the org.web3j.codegen.SolidityFunctionWrapperGenerator in the 
 * <a href="https://github.com/web3j/web3j/tree/master/codegen">codegen module</a> to update.
 *
 * <p>Generated with web3j version 1.5.2.
 */
@SuppressWarnings("rawtypes")
class TangemPaymentAccount extends Contract {
    public static final String BINARY = "60c06040523060a0523480156200001557600080fd5b5060405162005aa938038062005aa983398101604081905262000038916200010a565b6001600160a01b0381166080526200004f62000056565b506200013c565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000a75760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620001075780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6000602082840312156200011d57600080fd5b81516001600160a01b03811681146200013557600080fd5b9392505050565b60805160a05161592b6200017e600039600081816132fe0152818161332701526135880152600081816104d301528181610578015261290d015261592b6000f3fe6080604052600436106102c85760003560e01c806386489ba911610175578063c470d703116100dc578063df7727b411610095578063e3dbffd51161006f578063e3dbffd514610a40578063e4d7ddb914610a60578063e6e268f414610a80578063f89db45714610a9557600080fd5b8063df7727b4146102f5578063e1a8eafd146109b2578063e37b8154146109d257600080fd5b8063c470d703146108da578063c81656c81461090e578063ce1b1d431461093b578063d47ae89c1461095b578063dbed8faa14610970578063dcab7e501461099057600080fd5b8063a789457d1161012e578063a789457d1461077b578063ad3cb1cc14610827578063b4d02d0d14610865578063b9603bdf14610885578063be69191d146108a5578063c45a0155146108ba57600080fd5b806386489ba9146106c657806386f15d09146106e65780638bbe11af146106fb5780638c3b2a9b1461071b5780638da5cb5b1461073b578063a075b7c71461075b57600080fd5b80633c1a5012116102345780636b2a3830116101ed5780637da0a877116101c75780637da0a87714610569578063806679e41461059c57806384b0196e146105bc578063860aefcf146105e457600080fd5b80636b2a3830146105135780636b4943a7146105335780637b1039991461054957600080fd5b80633c1a501214610439578063456575e51461045957806346236eb9146104795780634f1ef2861461048e57806352d1902d146104a1578063572b6c05146104b657600080fd5b806322611280116102865780632261128014610377578063229865d11461038c5780633013ce29146103ac578063309433ba146103e457806334284dfb1461040457806335ba9af81461042457600080fd5b806274f356146102cd57806301e948ff146102f55780630381b4dd1461030a5780630f1071be1461032c57806319cdeb6f146103415780631f852f4b14610357575b600080fd5b3480156102d957600080fd5b506102e2610ab5565b6040519081526020015b60405180910390f35b34801561030157600080fd5b506102e2610acf565b34801561031657600080fd5b5061032a610325366004614b0d565b610ae0565b005b34801561033857600080fd5b506102e2610dde565b34801561034d57600080fd5b506102e260065481565b34801561036357600080fd5b5061032a610372366004614b8d565b610e63565b34801561038357600080fd5b5061032a610fa7565b34801561039857600080fd5b5061032a6103a7366004614be2565b611034565b3480156103b857600080fd5b506000546103cc906001600160a01b031681565b6040516001600160a01b0390911681526020016102ec565b3480156103f057600080fd5b5061032a6103ff366004614c2a565b6110cb565b34801561041057600080fd5b5061032a61041f366004614cb0565b611337565b34801561043057600080fd5b506102e26113fd565b34801561044557600080fd5b5061032a610454366004614d0b565b611490565b34801561046557600080fd5b5061032a610474366004614b0d565b61151c565b34801561048557600080fd5b50601c546102e2565b61032a61049c366004614d3e565b6115bc565b3480156104ad57600080fd5b506102e26115db565b3480156104c257600080fd5b506105036104d1366004614d0b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0390811691161490565b60405190151581526020016102ec565b34801561051f57600080fd5b5061032a61052e366004614be2565b6115f8565b34801561053f57600080fd5b506102e260075481565b34801561055557600080fd5b506002546103cc906001600160a01b031681565b34801561057557600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006103cc565b3480156105a857600080fd5b5061032a6105b7366004614e02565b611749565b3480156105c857600080fd5b506105d16117ed565b6040516102ec9796959493929190614e8b565b3480156105f057600080fd5b506040805160a08082018352600d54825282518084018452600e548152600f546020828101919091528084019190915283518085018552601054815260115481830152838501528351808201855260125481526060808501919091526013546080808601919091528551938401865260145484528551808701875260155481526016548185015284840152855180870187526017548152601854818501528487015285519283019095526019548252820152601a5492810192909252601b546106b7929083565b6040516102ec93929190614f6c565b3480156106d257600080fd5b5061032a6106e1366004614f97565b611899565b3480156106f257600080fd5b50610503611a66565b34801561070757600080fd5b5061032a610716366004614be2565b611a90565b34801561072757600080fd5b5061032a610736366004614ff0565b611ba9565b34801561074757600080fd5b506004546103cc906001600160a01b031681565b34801561076757600080fd5b5061032a610776366004615023565b611cf8565b34801561078757600080fd5b506040805180820182526008546001600160a01b039081168252825180840184526009546001600160801b0319608082811b8216845261ffff600160801b9384900481166020868101919091528088019590955287518089018952600a5490961686528751808901909852600b549182901b9092168752919091041684820152810192909252600c54610818929083565b6040516102ec93929190615086565b34801561083357600080fd5b50610858604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516102ec91906150af565b34801561087157600080fd5b5061032a610880366004614be2565b611de0565b34801561089157600080fd5b5061032a6108a0366004614be2565b611ee3565b3480156108b157600080fd5b5061050361201c565b3480156108c657600080fd5b506001546103cc906001600160a01b031681565b3480156108e657600080fd5b507f3fc394ec90f88dd7e18c46ffeef55f1b6719a2027f4ae9fbc4ab118271891200546102e2565b34801561091a57600080fd5b506102e2610929366004614be2565b6000908152601d602052604090205490565b34801561094757600080fd5b506003546103cc906001600160a01b031681565b34801561096757600080fd5b506102e2612044565b34801561097c57600080fd5b5061032a61098b366004614be2565b6120c8565b34801561099c57600080fd5b506000805160206154fc833981519152546102e2565b3480156109be57600080fd5b5061032a6109cd366004614d0b565b612127565b3480156109de57600080fd5b50610a1b6109ed366004614be2565b600560205260009081526040902080546001909101546001600160801b03811690600160801b900460ff1683565b604080519384526001600160801b0390921660208401521515908201526060016102ec565b348015610a4c57600080fd5b5061032a610a5b366004614be2565b6122c6565b348015610a6c57600080fd5b5061032a610a7b366004614b0d565b6124ac565b348015610a8c57600080fd5b506102e261265c565b348015610aa157600080fd5b5061032a610ab0366004614be2565b612673565b6000806000805160206154dc8339815191525b5492915050565b6000610adb600061284d565b905090565b6003546001600160a01b0316610af4612909565b6001600160a01b0316146040518060600160405280603381526020016153166033913990610b3e5760405162461bcd60e51b8152600401610b3591906150af565b60405180910390fd5b50610b488161295b565b60008281526005602052604081205490818311610b7b575081808203828214610b7557610b75858261299b565b50610bff565b50806000610b89600d6129e0565b8054909150600081851015610bbf57610bae858303610ba98560006129ff565b612a6b565b9050610bbc81610ba9610acf565b90505b8015610be7576000610bd382878903612a6b565b948501949050610be584826000612a83565b505b838603868514610bfa57610bfa81612aaa565b505050505b8160075410156040518060600160405280602981526020016158226029913990610c3c5760405162461bcd60e51b8152600401610b3591906150af565b50600780548390039055600084815260056020908152604080832092835560019290920180546001600160881b0319169055600354825163659bf9d960e11b81529251610cdf936001600160a01b039092169263cb37f3b292600480820193918290030181865afa158015610cb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd991906150c2565b82612b0b565b604080518481526020810183905285917fa06caae8c696e5deb33f685024044b74125cb932e11521aef47de748321657c4910160405180910390a26000546040516370a0823160e01b81523060048201527f273f30c859762d267fd40559825ed2fa0f467908c92843dfd0184b9d577dc082916001600160a01b0316906370a0823190602401602060405180830381865afa158015610d82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da691906150df565b600754610db1610ab5565b601c546040805194855260208501939093529183015260608201526080015b60405180910390a150505050565b6000610adb600360009054906101000a90046001600160a01b03166001600160a01b0316630f1071be6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5a91906150df565b6283d600612a6b565b6004546001600160a01b0316610e77612909565b6001600160a01b03161480610eae5750610e916008612c1b565b546001600160a01b0316610ea3612909565b6001600160a01b0316145b6040518060600160405280602f815260200161589e602f913990610ee55760405162461bcd60e51b8152600401610b3591906150af565b50610ef1838383612c36565b600480546001600160a01b038581166001600160a01b0319831681178455600254604051635cd2673760e01b815293831694840185905260248401919091521690635cd2673790604401600060405180830381600087803b158015610f5557600080fd5b505af1158015610f69573d6000803e3d6000fd5b50506040516001600160a01b03871681527f50146d0e3c60aa1d17a70635b05494f864e86144a2201275021014fbf08bafe292506020019050610dd0565b6004546001600160a01b0316610fbb612909565b6001600160a01b03161480610ff25750610fd56008612c1b565b546001600160a01b0316610fe7612909565b6001600160a01b0316145b6040518060600160405280602f815260200161589e602f9139906110295760405162461bcd60e51b8152600401610b3591906150af565b50611032612d2a565b565b6004546001600160a01b0316611048612909565b6001600160a01b0316148061107f57506110626008612c1b565b546001600160a01b0316611074612909565b6001600160a01b0316145b6040518060600160405280602f815260200161589e602f9139906110b65760405162461bcd60e51b8152600401610b3591906150af565b506110c8816110c3612044565b612d7b565b50565b6004546001600160a01b03166110df612909565b6001600160a01b0316148061111657506110f96008612c1b565b546001600160a01b031661110b612909565b6001600160a01b0316145b6040518060600160405280602f815260200161589e602f91399061114d5760405162461bcd60e51b8152600401610b3591906150af565b50611159858383612c36565b600c541561122857600a546040805180820182526001600160a01b03888116825282518084019093526001600160801b03198816835261ffff87166020848101919091528201929092529116906111bb906111b2612044565b60089190612e79565b600254604051630747fc3760e41b81526001600160a01b03838116600483015288811660248301529091169063747fc37090604401600060405180830381600087803b15801561120a57600080fd5b505af115801561121e573d6000803e3d6000fd5b50505050506112db565b61127b6040518060400160405280876001600160a01b031681526020016040518060400160405280886001600160801b03191681526020018761ffff16815250815250600861302090919063ffffffff16565b60025460405163346b888d60e11b81526001600160a01b038781166004830152909116906368d7111a90602401600060405180830381600087803b1580156112c257600080fd5b505af11580156112d6573d6000803e3d6000fd5b505050505b604080516001600160a01b03871681526001600160801b03198616602082015261ffff85168183015290517fae81d31085749debb22edb9a09f263e50cf6047cfc57ec741c07ce62b1121b9a9181900360600190a15050505050565b6003546001600160a01b031661134b612909565b6001600160a01b031614604051806060016040528060338152602001615316603391399061138c5760405162461bcd60e51b8152600401610b3591906150af565b50600161139a8484846130c1565b6113a68686848461311d565b604080518681526001600160801b03198616602082015261ffff851681830152905187917faab1db26b8ce0ed14d67fd3d8eab92617f4caf4134148122ad6f2a4e20068df7919081900360600190a2505050505050565b600080546040516370a0823160e01b815230600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015611446573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146a91906150df565b905060075481101561147d57600061148a565b60075461148a908261510e565b91505090565b6004546001600160a01b03166114a4612909565b6001600160a01b031614806114db57506114be6008612c1b565b546001600160a01b03166114d0612909565b6001600160a01b0316145b6040518060600160405280602f815260200161589e602f9139906115125760405162461bcd60e51b8152600401610b3591906150af565b506110c881613186565b6003546001600160a01b0316611530612909565b6001600160a01b03161460405180606001604052806033815260200161531660339139906115715760405162461bcd60e51b8152600401610b3591906150af565b5061157e601c8383613274565b817fea92e836c1b642a333bb58b44d5f13c5a066c5b0f35b8d6da5032af605c9e031826040516115b091815260200190565b60405180910390a25050565b6115c46132f3565b6115cd82613398565b6115d782826134c0565b5050565b60006115e561357d565b506000805160206155cf83398151915290565b6003546001600160a01b031661160c612909565b6001600160a01b031614604051806060016040528060338152602001615316603391399061164d5760405162461bcd60e51b8152600401610b3591906150af565b5060008160065461165e9190615121565b6000546040516370a0823160e01b81523060048201529192506001600160a01b0316906370a0823190602401602060405180830381865afa1580156116a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116cb91906150df565b8111156040518060600160405280603781526020016153c760379139906117055760405162461bcd60e51b8152600401610b3591906150af565b50600681905560408051838152602081018390527fd6004694c2f543b69302481de26731f63c1d41062795b5366d8ca20fd3e3d6d391015b60405180910390a15050565b6003546001600160a01b031661175d612909565b6001600160a01b031614604051806060016040528060338152602001615316603391399061179e5760405162461bcd60e51b8152600401610b3591906150af565b5060006117ad8484848461311d565b837f5e1266400272ee17509f7d7edb190c0fa83572f90677ee6a3bbfac22bf1f679d846040516117df91815260200190565b60405180910390a250505050565b60006060808280808381600080516020615541833981519152805490915015801561181a57506001810154155b61185e5760405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606401610b35565b6118666135c6565b61186e613689565b60408051600080825260208201909252600f60f81b9c939b5091995046985030975095509350915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff166000811580156118df5750825b905060008267ffffffffffffffff1660011480156118fc5750303b155b90508115801561190a575080155b156119285760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561195257845460ff60401b1916600160401b1785555b61195a6136c8565b6119626136c8565b6119b16040518060400160405280601481526020017315185b99d95b54185e5b595b9d1058d8dbdd5b9d60621b815250604051806040016040528060018152602001603160f81b8152506136d0565b6119b96136c8565b6119c1612909565b600180546001600160a01b03199081166001600160a01b03938416179091556004805482168e841617905560028054909116918c16919091179055611a13611a0b8a8a8a8a6136e2565b600d90613780565b8315611a5957845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050505050565b6000805160206154fc8339815191525460009060008051602061549c83398151915290151561148a565b6000818152600560205260409020600181015490546001600160801b0390911690611ab9610dde565b611ac39083615121565b42116040518060600160405280602b8152602001615349602b913990611afc5760405162461bcd60e51b8152600401610b3591906150af565b508060075410156040518060600160405280602981526020016158226029913990611b3a5760405162461bcd60e51b8152600401610b3591906150af565b5060078054829003905560008381526005602052604080822091825560019190910180546001600160881b03191690555183907f056bed1bad5d90aa1df671c8d28b1bbb82ff67fd545f804e63cd261140b11f7b90611b9c9084815260200190565b60405180910390a2505050565b6004546001600160a01b0316611bbd612909565b6001600160a01b03161480611bf45750611bd76008612c1b565b546001600160a01b0316611be9612909565b6001600160a01b0316145b6040518060600160405280602f815260200161589e602f913990611c2b5760405162461bcd60e51b8152600401610b3591906150af565b50600c5415156040518060600160405280603181526020016157c66031913990611c685760405162461bcd60e51b8152600401610b3591906150af565b50604080518082018252600a546001600160a01b0316815281518083019092526001600160801b03198416825261ffff8316602083810191909152810191909152611cb5906111b2612044565b604080516001600160801b03198416815261ffff831660208201527fc50d2cc66f62a75104edeabfbcedb2a37ebd1cb8ce0b873ec3afa504e8bb1480910161173d565b6004546001600160a01b0316611d0c612909565b6001600160a01b03161480611d435750611d266008612c1b565b546001600160a01b0316611d38612909565b6001600160a01b0316145b6040518060600160405280602f815260200161589e602f913990611d7a5760405162461bcd60e51b8152600401610b3591906150af565b50611d9b611d8a858585856136e2565b611d92612044565b600d919061380c565b6040805185815260208101859052908101839052606081018290527ffc3ccf3ca5a38fad8786ed39386de19cb574b06205422992c583e4753aa6268f90608001610dd0565b6004546001600160a01b0316611df4612909565b6001600160a01b03161480611e2b5750611e0e6008612c1b565b546001600160a01b0316611e20612909565b6001600160a01b0316145b6040518060600160405280602f815260200161589e602f913990611e625760405162461bcd60e51b8152600401610b3591906150af565b506110c881600360009054906101000a90046001600160a01b03166001600160a01b031663cb37f3b26040518163ffffffff1660e01b8152600401602060405180830381865afa158015611eba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ede91906150c2565b6138fa565b6003546001600160a01b0316611ef7612909565b6001600160a01b0316146040518060600160405280603381526020016153166033913990611f385760405162461bcd60e51b8152600401610b3591906150af565b506000546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611f81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa591906150df565b8111156040518060600160405280603781526020016153c76037913990611fdf5760405162461bcd60e51b8152600401610b3591906150af565b5060068190556040518181527f321b800465e47508430424e6c089344256e17f9a5b0b43c751dffbdfd3930263906020015b60405180910390a150565b600060008051602061549c83398151915261148a6000805160206154fc833981519152613a4c565b6000610adb600360009054906101000a90046001600160a01b03166001600160a01b031663d47ae89c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561209c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c091906150df565b610e10612a6b565b6003546001600160a01b03166120dc612909565b6001600160a01b031614604051806060016040528060338152602001615316603391399061211d5760405162461bcd60e51b8152600401610b3591906150af565b506110c881613ab4565b6004546001600160a01b031661213b612909565b6001600160a01b0316148061217257506121556008612c1b565b546001600160a01b0316612167612909565b6001600160a01b0316145b6040518060600160405280602f815260200161589e602f9139906121a95760405162461bcd60e51b8152600401610b3591906150af565b50600354604080516060810190915260238082526001600160a01b0390921615916153fe6020830139906121f05760405162461bcd60e51b8152600401610b3591906150af565b50600380546001600160a01b0319166001600160a01b03831690811790915560408051633013ce2960e01b81529051633013ce29916004808201926020929091908290030181865afa15801561224a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061226e91906150c2565b600080546001600160a01b0319166001600160a01b0392831690811790915560408051928416835260208301919091527fb84a8bf26086331c9421c7ce6650da3b0ef748bd335c3f00ada56f481e4321939101612011565b6003546001600160a01b03166122da612909565b6001600160a01b031614604051806060016040528060338152602001615316603391399061231b5760405162461bcd60e51b8152600401610b3591906150af565b50600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015612365573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061238991906150df565b9050600360009054906101000a90046001600160a01b03166001600160a01b0316632cc326416040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156123db57600080fd5b505af11580156123ef573d6000803e3d6000fd5b5050600080546040516370a0823160e01b81523060048201529193508492506001600160a01b0316906370a0823190602401602060405180830381865afa15801561243e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061246291906150df565b61246c919061510e565b905061247a601c8483613b81565b827f2c6a6ee02f179bb5f13a4b7fdc9ccd1dd37e524b48ff0957a931348cc9ad75c082604051611b9c91815260200190565b6003546001600160a01b03166124c0612909565b6001600160a01b03161460405180606001604052806033815260200161531660339139906125015760405162461bcd60e51b8152600401610b3591906150af565b506000600560008481526020019081526020016000206000015490506000811160405180606001604052806023815260200161547960239139906125585760405162461bcd60e51b8152600401610b3591906150af565b508082106040518060600160405280603b81526020016156d7603b9139906125935760405162461bcd60e51b8152600401610b3591906150af565b508181036125a1848261299b565b80600754101560405180606001604052806029815260200161582260299139906125de5760405162461bcd60e51b8152600401610b3591906150af565b50600780548290039055600083900361261857600084815260056020526040812090815560010180546001600160881b031916905561262a565b60008481526005602052604090208390555b837f8274e5392b3ab6bba68ee0567f4ede55e361239b8d0122fa5d3b5dc36497b91d846040516117df91815260200190565b60008060008051602061549c833981519152610ac8565b6003546001600160a01b0316612687612909565b6001600160a01b03161460405180606001604052806033815260200161531660339139906126c85760405162461bcd60e51b8152600401610b3591906150af565b50600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015612712573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061273691906150df565b9050600360009054906101000a90046001600160a01b03166001600160a01b0316632cc326416040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561278857600080fd5b505af115801561279c573d6000803e3d6000fd5b5050600080546040516370a0823160e01b81523060048201529193508492506001600160a01b0316906370a0823190602401602060405180830381865afa1580156127eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061280f91906150df565b612819919061510e565b9050827f2c6a6ee02f179bb5f13a4b7fdc9ccd1dd37e524b48ff0957a931348cc9ad75c082604051611b9c91815260200190565b600080546040516370a0823160e01b815230600482015282916128c8916001600160a01b03909116906370a0823190602401602060405180830381865afa15801561289c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c091906150df565b600654612a6b565b600754909150836128e8576128db61265c565b6128e59082615121565b90505b808210156128f7576000612901565b612901818361510e565b949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633148015612944575060143610155b15612956575060131936013560601c90565b503390565b60408051808201909152601b81526000805160206154218339815191526020820152816115d75760405162461bcd60e51b8152600401610b3591906150af565b6000828152600560205260409020600101546001600160801b03811690600160801b900460ff166129da8383836129d2600d6129e0565b929190613c6c565b50505050565b60004282600e015411156129f457816129f9565b816007015b92915050565b6000612a0d83600501613a4c565b15612a3e578115612a23575060018201546129f9565b60018301546003840154612a379190612a6b565b90506129f9565b8115612a5057612a3783600101613c9a565b612a37612a5f84600101613c9a565b610ba985600301613c9a565b6000818310612a7a5781612a7c565b825b9392505050565b612a8c83613cbc565b612a968383613cee565b80612aa557612aa58383613cfb565b505050565b6000805160206154dc833981519152805482908290600090612acd908490615121565b909155505080546040805184815260208101929092527ff3a2c404b3362c4238317c3dad1020c2e9e984ba8df38a4a1ff18d57e92a242a910161173d565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015612b54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b7891906150df565b905080600654146040518060600160405280603381526020016157656033913990612bb65760405162461bcd60e51b8152600401610b3591906150af565b5060408051808201909152601f81526000805160206154bc833981519152602082015282821015612bfa5760405162461bcd60e51b8152600401610b3591906150af565b50600680548390039055600054612aa5906001600160a01b03168484613d08565b60004282600401541115612c2f57816129f9565b5060020190565b60408051602081019091527f3fc394ec90f88dd7e18c46ffeef55f1b6719a2027f4ae9fbc4ab1182718912008054825290600090612c7c90612c7790613d5a565b613db2565b90506000612cc08286868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613ddf92505050565b9050856001600160a01b0316816001600160a01b0316146040518060600160405280602b81526020016157f7602b913990612d0e5760405162461bcd60e51b8152600401610b3591906150af565b508254836000612d1d83615134565b9190505550505050505050565b600060008051602061549c8339815191528181556000805160206154fc83398151915282905560405190917f8892a543ee6d561b73cc067b2cde5a76c251a4e0b978d92390f1301db5d125ab91a150565b60408051808201909152601b8152600080516020615421833981519152602082015282612dbb5760405162461bcd60e51b8152600401610b3591906150af565b50612dc46113fd565b8211156040518060400160405280601f81526020016000805160206154bc83398151915281525090612e095760405162461bcd60e51b8152600401610b3591906150af565b5060008051602061549c833981519152828155612e346000805160206154fc83398151915283613e09565b60018101546040805185815260208101929092527ffa4870dc2e2f95d11863e7e765a98e12fe92c3d1d2a703b4cf983f9c4b1052e691015b60405180910390a1505050565b602082015151600384015460801b6001600160801b03199081169116141580612ebc575060208083015101516003840154600160801b900461ffff908116911614155b80612ed95750815160028401546001600160a01b03908116911614155b60405180606001604052806027815260200161568e6027913990612f105760405162461bcd60e51b8152600401610b3591906150af565b506004830154421015612f895781516002840180546001600160a01b039092166001600160a01b03199092169190911790556020808301518051600386018054929093015161ffff16600160801b026001600160901b031990921660809190911c17179055612f7f8142615121565b6004840155505050565b60028301805484546001600160a01b03199081166001600160a01b0380841691909117875560038701805460018901805461ffff600160801b808504821681026001600160901b03199384166001600160801b03871617179093558a51909516959096169490941790955560208088015180519101519092169092029290931660809390931c92909217179055612f7f8142615121565b60048201541515156040518060600160405280602f81526020016152e7602f91399061305f5760405162461bcd60e51b8152600401610b3591906150af565b5080516002830180546001600160a01b039092166001600160a01b03199092169190911790556020908101518051600384018054929093015161ffff16600160801b026001600160901b031990921660809190911c1717905542600490910155565b600c54421015806130cf5750805b60405180606001604052806035815260200161565960359139906131065760405162461bcd60e51b8152600401610b3591906150af565b50612aa583836131166008612c1b565b9190613e6c565b600560008581526020019081526020016000206000015460001460405180606001604052806029815260200161573c602991399061316e5760405162461bcd60e51b8152600401610b3591906150af565b5061317a838383613e87565b6129da84848484613ec8565b60008051602061549c833981519152805461319f6113fd565b8111156040518060400160405280601f81526020016000805160206154bc833981519152815250906131e45760405162461bcd60e51b8152600401610b3591906150af565b506131ed61201c565b60405180606001604052806038815260200161544160389139906132245760405162461bcd60e51b8152600401610b3591906150af565b50600080835560018301556132398382614067565b826001600160a01b03167fa578b4c05763eb039caef37b2d7b949c22914c3838384c9c73cefb78c4a8ed0a82604051611b9c91815260200190565b826001016000838152602001908152602001600020546000146040518060600160405280602a8152602001615374602a9139906132c45760405162461bcd60e51b8152600401610b3591906150af565b50600082815260018401602052604081208290558354829185916132e9908490615121565b9091555050505050565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061337a57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661336e6000805160206155cf833981519152546001600160a01b031690565b6001600160a01b031614155b156110325760405163703e46dd60e11b815260040160405180910390fd5b6004546001600160a01b03166133ac612909565b6001600160a01b031614806133e357506133c66008612c1b565b546001600160a01b03166133d8612909565b6001600160a01b0316145b6040518060600160405280602f815260200161589e602f91399061341a5760405162461bcd60e51b8152600401610b3591906150af565b506001546040516316da1fb760e11b81526001600160a01b03838116600483015290911690632db43f6e90602401602060405180830381865afa158015613465573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613489919061514d565b6040518060600160405280602981526020016158cd60299139906115d75760405162461bcd60e51b8152600401610b3591906150af565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561351a575060408051601f3d908101601f19168201909252613517918101906150df565b60015b61354257604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610b35565b6000805160206155cf833981519152811461357357604051632a87526960e21b815260048101829052602401610b35565b612aa583836140a0565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146110325760405163703e46dd60e11b815260040160405180910390fd5b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1028054606091600080516020615541833981519152916136059061516a565b80601f01602080910402602001604051908101604052809291908181526020018280546136319061516a565b801561367e5780601f106136535761010080835404028352916020019161367e565b820191906000526020600020905b81548152906001019060200180831161366157829003601f168201915b505050505091505090565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1038054606091600080516020615541833981519152916136059061516a565b6110326140f6565b6136d86140f6565b6115d7828261413f565b6136ea614a94565b600082116040518060600160405280602e815260200161584b602e9139906137255760405162461bcd60e51b8152600401610b3591906150af565b50506040805160a0810182529485528051808201825293845260006020858101829052808701959095528151808301835293845283850152848101929092528151928301909152600182526060830191909152608082015290565b600e8201541515156040518060600160405280602f81526020016152e7602f9139906137bf5760405162461bcd60e51b8152600401610b3591906150af565b508051600783015560208082015180516008850155810151600984015560408201518051600a8501550151600b830155606081015151600c83015560800151600d82015542600e90910155565b600e830154421015613870578151600784015560208083015180516008860155810151600985015560408301518051600a8601550151600b840155606082015151600c8401556080820151600d8401556138668142615121565b600e840155505050565b600783018054845560088401805460018601556009850180546002870155600a860180546003880155600b870180546004890155600c8801805460058a0155600d8901805460068b01558851909655602080890151805190965594850151909355604087015180519092559201519091556060840151519055608083015190556138668142615121565b6000805160206154dc8339815191526000613913610acf565b825460408051808201909152601b8152600080516020615421833981519152602082015291925090856139595760405162461bcd60e51b8152600401610b3591906150af565b5060408051808201909152601d81527f353430327c446562743a206e6f2066756e647320617661696c61626c650000006020820152826139ac5760405162461bcd60e51b8152600401610b3591906150af565b508085111560405180606001604052806025815260200161556160259139906139e85760405162461bcd60e51b8152600401610b3591906150af565b5060006139f58387612a6b565b845481900385559050613a088582614151565b83546040805183815260208101929092527f75aec94f6ad949cfd9728eb818639f1b0b882089b480409ab73245c06469eef4910160405180910390a1505050505050565b6000613a588254151590565b6040518060400160405280601d81526020017f353534317c54696d6572733a2074696d6572206e6f742061637469766500000081525090613aac5760405162461bcd60e51b8152600401610b3591906150af565b505054421190565b6000805160206154dc833981519152805460408051808201909152601b8152600080516020615421833981519152602082015283613b055760405162461bcd60e51b8152600401610b3591906150af565b50808311156040518060600160405280602581526020016155616025913990613b415760405162461bcd60e51b8152600401610b3591906150af565b5081548390038083556040805185815260208101929092527fb940258db5193d85cafbc591d0c29fad88d804ff8b9ab71c8f9545af2bb2c07c9101612e6c565b60008360010160008481526020019081526020016000205490506000811160405180606001604052806025815260200161551c6025913990613bd65760405162461bcd60e51b8152600401610b3591906150af565b508082146040518060600160405280602581526020016158796025913990613c115760405162461bcd60e51b8152600401610b3591906150af565b5083600001548111156040518060600160405280602a8152602001615712602a913990613c515760405162461bcd60e51b8152600401610b3591906150af565b50835403835550600090815260019091016020526040812055565b613c76848361415b565b156129da57613c886001850184614199565b806129da576129da6003850184614199565b805460018201546000919080821015613cb4576000612901565b900392915050565b613cc881600501613a4c565b156110c857600060028201556000600482015560068101546110c8906005830190613e09565b6115d760018301826141e8565b6115d760038301826141e8565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612aa5908490614205565b60006040518060600160405280602281526020016156b56022913980516020918201208351604051613d959301918252602082015260400190565b604051602081830303815290604052805190602001209050919050565b60006129f9613dbf614268565b8360405161190160f01b8152600281019290925260228201526042902090565b600080600080613def8686614272565b925092509250613dff82826142bf565b5090949350505050565b60408051808201909152601781527f353534307c54696d6572733a207a65726f2064656c6179000000000000000000602082015281613e5b5760405162461bcd60e51b8152600401610b3591906150af565b50613e668142615121565b90915550565b8254612aa59060018501906001600160a01b03168484614378565b601b5442101580613e955750815b15613eb057612aa58382613ea9600d6129e0565b9190614500565b613ebc600d8483614500565b612aa560148483614500565b613ed18361295b565b60008215613f3c576000613ee5600161284d565b9050848110613ef657849150613f36565b809150857f83067e3478aa8b638f7e34eeecb23875cc3671e615445e892cc22dcd4c8b8df3828703604051613f2d91815260200190565b60405180910390a25b50613f8e565b613f44610acf565b8411156040518060400160405280601f81526020016000805160206154bc83398151915281525090613f895760405162461bcd60e51b8152600401610b3591906150af565b508390505b60408051808201909152601f81527f353331337c4163636f756e743a206e6f2066756e647320746f20626c6f636b00602082015281613fe05760405162461bcd60e51b8152600401610b3591906150af565b50604080516060810182528281526001600160801b03428116602080840191825286151584860190815260008b815260059092529481209351845590516001909301805494511515600160801b026001600160881b03199095169390921692909217929092179091556007805483929061405b908490615121565b90915550505050505050565b806006541015614078576000614086565b80600654614086919061510e565b6006556000546115d7906001600160a01b03168383613d08565b6140a982614562565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156140ee57612aa582826145c7565b6115d761463d565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661103257604051631afcd79f60e31b815260040160405180910390fd5b6141476140f6565b6115d7828261465c565b6115d78282612b0b565b60006005830161416a81613a4c565b156141795760009150506129f9565b6006840154815460009161418c9161510e565b84101592506129f9915050565b80826001015410156040518060600160405280602e8152602001615798602e9139906141d85760405162461bcd60e51b8152600401610b3591906150af565b5060019091018054919091039055565b808260010160008282546141fc9190615121565b90915550505050565b600061421a6001600160a01b038416836146bd565b9050805160001415801561423f57508080602001905181019061423d919061514d565b155b15612aa557604051635274afe760e01b81526001600160a01b0384166004820152602401610b35565b6000610adb6146cb565b600080600083516041036142ac5760208401516040850151606086015160001a61429e8882858561473f565b9550955095505050506142b8565b50508151600091506002905b9250925092565b60008260038111156142d3576142d36151a4565b036142dc575050565b60018260038111156142f0576142f06151a4565b0361430e5760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115614322576143226151a4565b036143435760405163fce698f760e01b815260048101829052602401610b35565b6003826003811115614357576143576151a4565b036115d7576040516335e2f38360e21b815260048101829052602401610b35565b83546040805160608101909152602980825261ffff600160801b90930483169284168311919061539e6020830139906143c45760405162461bcd60e51b8152600401610b3591906150af565b5082825b8261ffff168161ffff161015614482576040516bffffffffffffffffffffffff19606088901b1660208201526001600160f01b031960f083901b1660348201526001600160801b03198316603682015260029060460160408051601f1981840301815290829052614438916151ba565b602060405180830381855afa158015614455573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061447891906150df565b91506001016143c8565b5085546040805160608101909152602180825260809290921b6001600160801b031990811690841614916155ae6020830139906144d25760405162461bcd60e51b8152600401610b3591906150af565b5050845461ffff909216600160801b026001600160901b031990921660809390931c92909217179092555050565b82600001548211156040518060600160405280603b815260200161561e603b91399061453f5760405162461bcd60e51b8152600401610b3591906150af565b5061454983613cbc565b614553838361480e565b80612aa557612aa5838361485d565b806001600160a01b03163b60000361459857604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610b35565b6000805160206155cf83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516145e491906151ba565b600060405180830381855af49150503d806000811461461f576040519150601f19603f3d011682016040523d82523d6000602084013e614624565b606091505b50915091506146348583836148af565b95945050505050565b34156110325760405163b398979f60e01b815260040160405180910390fd5b6146646140f6565b6000805160206155418339815191527fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10261469e8482615226565b50600381016146ad8382615226565b5060008082556001909101555050565b6060612a7c8383600061490b565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6146f66149a8565b6146fe614a12565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561477a5750600091506003905082614804565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156147ce573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166147fa57506000925060019150829050614804565b9250600091508190505b9450945094915050565b61481b6001830182614a56565b60405180606001604052806028815260200161558660289139906148525760405162461bcd60e51b8152600401610b3591906150af565b506115d78282613cee565b61486a6003830182614a56565b6040518060600160405280602f81526020016155ef602f9139906148a15760405162461bcd60e51b8152600401610b3591906150af565b506115d760038301826141e8565b6060826148c4576148bf82614a6b565b612a7c565b81511580156148db57506001600160a01b0384163b155b1561490457604051639996b31560e01b81526001600160a01b0385166004820152602401610b35565b5092915050565b6060814710156149305760405163cd78605960e01b8152306004820152602401610b35565b600080856001600160a01b0316848660405161494c91906151ba565b60006040518083038185875af1925050503d8060008114614989576040519150601f19603f3d011682016040523d82523d6000602084013e61498e565b606091505b509150915061499e8683836148af565b9695505050505050565b6000600080516020615541833981519152816149c26135c6565b8051909150156149da57805160209091012092915050565b815480156149e9579392505050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470935050505090565b600060008051602061554183398151915281614a2c613689565b805190915015614a4457805160209091012092915050565b600182015480156149e9579392505050565b6000614a6183613c9a565b9091111592915050565b805115614a7b5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6040518060a0016040528060008152602001614ac3604051806040016040528060008152602001600081525090565b8152602001614ae5604051806040016040528060008152602001600081525090565b8152602001614b006040518060200160405280600081525090565b8152602001600081525090565b60008060408385031215614b2057600080fd5b50508035926020909101359150565b6001600160a01b03811681146110c857600080fd5b60008083601f840112614b5657600080fd5b50813567ffffffffffffffff811115614b6e57600080fd5b602083019150836020828501011115614b8657600080fd5b9250929050565b600080600060408486031215614ba257600080fd5b8335614bad81614b2f565b9250602084013567ffffffffffffffff811115614bc957600080fd5b614bd586828701614b44565b9497909650939450505050565b600060208284031215614bf457600080fd5b5035919050565b80356001600160801b031981168114614c1357600080fd5b919050565b803561ffff81168114614c1357600080fd5b600080600080600060808688031215614c4257600080fd5b8535614c4d81614b2f565b9450614c5b60208701614bfb565b9350614c6960408701614c18565b9250606086013567ffffffffffffffff811115614c8557600080fd5b614c9188828901614b44565b969995985093965092949392505050565b80151581146110c857600080fd5b600080600080600060a08688031215614cc857600080fd5b8535945060208601359350614cdf60408701614bfb565b9250614ced60608701614c18565b91506080860135614cfd81614ca2565b809150509295509295909350565b600060208284031215614d1d57600080fd5b8135612a7c81614b2f565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215614d5157600080fd5b8235614d5c81614b2f565b9150602083013567ffffffffffffffff80821115614d7957600080fd5b818501915085601f830112614d8d57600080fd5b813581811115614d9f57614d9f614d28565b604051601f8201601f19908116603f01168101908382118183101715614dc757614dc7614d28565b81604052828152886020848701011115614de057600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b600080600060608486031215614e1757600080fd5b83359250602084013591506040840135614e3081614ca2565b809150509250925092565b60005b83811015614e56578181015183820152602001614e3e565b50506000910152565b60008151808452614e77816020860160208601614e3b565b601f01601f19169290920160200192915050565b60ff60f81b881681526000602060e06020840152614eac60e084018a614e5f565b8381036040850152614ebe818a614e5f565b606085018990526001600160a01b038816608086015260a0850187905284810360c08601528551808252602080880193509091019060005b81811015614f1257835183529284019291840191600101614ef6565b50909c9b505050505050505050505050565b8051825260208082015180518285015290810151604084015250604081015180516060840152602081015160808401525060608101515160a08301526080015160c090910152565b6101e08101614f7b8286614f24565b614f8860e0830185614f24565b826101c0830152949350505050565b60008060008060008060c08789031215614fb057600080fd5b8635614fbb81614b2f565b95506020870135614fcb81614b2f565b95989597505050506040840135936060810135936080820135935060a0909101359150565b6000806040838503121561500357600080fd5b61500c83614bfb565b915061501a60208401614c18565b90509250929050565b6000806000806080858703121561503957600080fd5b5050823594602084013594506040840135936060013592509050565b80516001600160a01b0316825260209081015180516001600160801b03191682840152015161ffff16604090910152565b60e081016150948286615055565b6150a16060830185615055565b8260c0830152949350505050565b602081526000612a7c6020830184614e5f565b6000602082840312156150d457600080fd5b8151612a7c81614b2f565b6000602082840312156150f157600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156129f9576129f96150f8565b808201808211156129f9576129f96150f8565b600060018201615146576151466150f8565b5060010190565b60006020828403121561515f57600080fd5b8151612a7c81614ca2565b600181811c9082168061517e57607f821691505b60208210810361519e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052602160045260246000fd5b600082516151cc818460208701614e3b565b9190910192915050565b601f821115612aa5576000816000526020600020601f850160051c810160208610156151ff5750805b601f850160051c820191505b8181101561521e5782815560010161520b565b505050505050565b815167ffffffffffffffff81111561524057615240614d28565b6152548161524e845461516a565b846151d6565b602080601f83116001811461528957600084156152715750858301515b600019600386901b1c1916600185901b17855561521e565b600085815260208120601f198616915b828110156152b857888601518255948401946001909101908401615299565b50858210156152d65787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fe353530307c44656c6179656453657474696e67733a2076616c756520616c726561647920696e697469616c697a6564353330327c4163636f756e743a206f6e6c792070726f636573736f722063616e2063616c6c20746869732066756e6374696f6e353334307c4163636f756e743a20736574746c656d656e7420706572696f64206973206e6f74206f766572353432307c526566756e64733a20726566756e64207265636f726420616c726561647920657869737473353531307c4f6e6554696d6550617373776f72643a20696e76616c6964204f545020636f756e746572353335307c4163636f756e743a20726573756c74696e672076657269666965642062616c616e636520657863656564732061637475616c353335317c4163636f756e743a2070726f636573736f7220616c726561647920736574353130307c436f6d6d6f6e3a20616d6f756e74206973207a65726f0000000000353431307c44656c617965645769746864726177616c733a207769746864726177616c2074696d656c6f636b206e6f742065787072696564353332307c4163636f756e743a207472616e73616374696f6e206e6f7420666f756e6476d8021c4b979e99674b80f4e0cc10154af0e5f32df05eb51b29a464e2435500353130317c436f6d6d6f6e3a20696e73756666696369656e742066756e6473003486e95df892f06bd37fd38c44e2fee4c4efb6660a66e6eb20ed6d8a167eae0076d8021c4b979e99674b80f4e0cc10154af0e5f32df05eb51b29a464e2435501353432317c526566756e64733a20726566756e64207265636f7264206e6f7420666f756e64a16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100353430337c446562743a20616d6f756e7420697320686967686572207468616e2064656274353532317c4163636f756e744c696d6974733a207370656e64206c696d6974206578636565646564353531317c4f6e6554696d6550617373776f72643a20696e76616c6964204f5450360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc353532337c4163636f756e744c696d6974733a206e6f206f7470207370656e64206c696d6974206578636565646564353532307c4163636f756e744c696d6974733a20616d6f756e7420657863656564732073696e676c65207472616e73616374696f6e206c696d6974353331327c4163636f756e743a2063617264206f72204f5450207374617465206368616e676520697320696e2070726f6772657373353530317c44656c6179656453657474696e67733a2076616c756520616c7265616479207365744f776e657273686970416363657074616e63652875696e74323536206e6f6e636529353332317c4163636f756e743a206e657720616d6f756e7420697320657175616c206f7220686967686572207468616e20617574686f72697a6564353432337c526566756e64733a2070656e64696e6720616d6f756e74206578636565647320746f74616c353331307c4163636f756e743a207472616e73616374696f6e20494420616c72656164792075736564353333307c4163636f756e743a2076657269666965642062616c616e6365206e6f7420657175616c20746f2062616c616e6365353533317c5370656e644c696d6974733a20696e73756666696369656e74207370656e7420746f2063616e63656c353335327c4163636f756e743a20636172642077697468206f7470207374617465206e6f7420696e697469616c697a6564353535307c4f776e657273686970416363657074616e63653a20696e76616c6964207369676e6174757265353330347c4163636f756e743a20696e73756666696369656e7420626c6f636b656420616d6f756e74353532347c4163636f756e744c696d6974733a207370656e64206c696d697420706572696f64206973207a65726f353432327c526566756e64733a20696e76616c696420616d6f756e74207265636569766564353330317c4163636f756e743a206f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f6e353337307c4163636f756e743a20756e617574686f72697a656420696d706c656d656e746174696f6ea26469706673582212201bf402f34a1057d0d739b2911423245677cc744b072d4af8e7f665bc51781a7f64736f6c63430008160033";

    public static final String FUNC_UPGRADE_INTERFACE_VERSION = "UPGRADE_INTERFACE_VERSION";

    public static final String FUNC_AUTHORIZEDTRANSACTIONS = "authorizedTransactions";

    public static final String FUNC_AVAILABLEFORDEBTPAYMENT = "availableForDebtPayment";

    public static final String FUNC_AVAILABLEFORPAYMENT = "availableForPayment";

    public static final String FUNC_AVAILABLEFORWITHDRAWAL = "availableForWithdrawal";

    public static final String FUNC_BLOCKEDAMOUNT = "blockedAmount";

    public static final String FUNC_CANCELWITHDRAWAL = "cancelWithdrawal";

    public static final String FUNC_CARDWITHOTP = "cardWithOtp";

    public static final String FUNC_DEBTAMOUNT = "debtAmount";

    public static final String FUNC_EIP712DOMAIN = "eip712Domain";

    public static final String FUNC_FACTORY = "factory";

    public static final String FUNC_INCREASEVERIFIEDBALANCE = "increaseVerifiedBalance";

    public static final String FUNC_INITWITHDRAWAL = "initWithdrawal";

    public static final String FUNC_INITIALIZE = "initialize";

    public static final String FUNC_ISTRUSTEDFORWARDER = "isTrustedForwarder";

    public static final String FUNC_ISWITHDRAWALINPROGRESS = "isWithdrawalInProgress";

    public static final String FUNC_ISWITHDRAWALREADY = "isWithdrawalReady";

    public static final String FUNC_LIMITS = "limits";

    public static final String FUNC_OWNER = "owner";

    public static final String FUNC_OWNERSHIPACCEPTANCENONCE = "ownershipAcceptanceNonce";

    public static final String FUNC_PAYMENTTOKEN = "paymentToken";

    public static final String FUNC_PENDINGREFUNDAMOUNT = "pendingRefundAmount";

    public static final String FUNC_PENDINGREFUNDTOTAL = "pendingRefundTotal";

    public static final String FUNC_PROCESSAUTHORIZATION = "processAuthorization";

    public static final String FUNC_PROCESSAUTHORIZATIONCHANGE = "processAuthorizationChange";

    public static final String FUNC_PROCESSAUTHORIZATIONNOOTP = "processAuthorizationNoOtp";

    public static final String FUNC_PROCESSDEBT = "processDebt";

    public static final String FUNC_PROCESSPENDINGREFUNDPAYMENT = "processPendingRefundPayment";

    public static final String FUNC_PROCESSREFUNDPAYMENT = "processRefundPayment";

    public static final String FUNC_PROCESSSETTLEMENT = "processSettlement";

    public static final String FUNC_PROCESSWITHDRAWAL = "processWithdrawal";

    public static final String FUNC_PROCESSOR = "processor";

    public static final String FUNC_PROXIABLEUUID = "proxiableUUID";

    public static final String FUNC_REGISTRY = "registry";

    public static final String FUNC_SAVEPENDINGREFUND = "savePendingRefund";

    public static final String FUNC_SECURITYDELAY = "securityDelay";

    public static final String FUNC_SETCARD = "setCard";

    public static final String FUNC_SETLIMITS = "setLimits";

    public static final String FUNC_SETOTPSTATE = "setOtpState";

    public static final String FUNC_SETOWNER = "setOwner";

    public static final String FUNC_SETPROCESSOR = "setProcessor";

    public static final String FUNC_SETVERIFIEDBALANCE = "setVerifiedBalance";

    public static final String FUNC_SETTLEMENTPERIOD = "settlementPeriod";

    public static final String FUNC_TRUSTEDFORWARDER = "trustedForwarder";

    public static final String FUNC_UNBLOCKUNSETTLEDTRANSACTION = "unblockUnsettledTransaction";

    public static final String FUNC_UPGRADETOANDCALL = "upgradeToAndCall";

    public static final String FUNC_VERIFIEDBALANCE = "verifiedBalance";

    public static final String FUNC_WITHDRAWALAMOUNT = "withdrawalAmount";

    public static final String FUNC_WITHDRAWALREADYTIMESTAMP = "withdrawalReadyTimestamp";

    public static final String FUNC_WRITEOFFDEBT = "writeOffDebt";

    public static final Event ACCOUNTSTATEAFTERSETTLEMENT_EVENT = new Event("AccountStateAfterSettlement",
            Arrays.asList(new TypeReference<Uint256>() {
            }, new TypeReference<Uint256>() {
            }, new TypeReference<Uint256>() {
            }, new TypeReference<Uint256>() {
            }));

    public static final Event CARDSET_EVENT = new Event("CardSet",
            Arrays.asList(new TypeReference<Address>() {
            }, new TypeReference<Bytes16>() {
            }, new TypeReference<Uint16>() {
            }));

    public static final Event DEBTINCREASED_EVENT = new Event("DebtIncreased",
            Arrays.asList(new TypeReference<Uint256>() {
            }, new TypeReference<Uint256>() {
            }));

    public static final Event DEBTPAID_EVENT = new Event("DebtPaid",
            Arrays.asList(new TypeReference<Uint256>() {
            }, new TypeReference<Uint256>() {
            }));

    public static final Event DEBTWRITTENOFF_EVENT = new Event("DebtWrittenOff",
            Arrays.asList(new TypeReference<Uint256>() {
            }, new TypeReference<Uint256>() {
            }));

    public static final Event EIP712DOMAINCHANGED_EVENT = new Event("EIP712DomainChanged",
            List.of());

    public static final Event INITIALIZED_EVENT = new Event("Initialized",
            List.of(new TypeReference<Uint64>() {
            }));

    public static final Event INSUFFICIENTFUNDSONFORCEDAUTH_EVENT = new Event("InsufficientFundsOnForcedAuth",
            Arrays.asList(new TypeReference<Uint256>(true) {
            }, new TypeReference<Uint256>() {
            }));

    public static final Event LIMITSSET_EVENT = new Event("LimitsSet",
            Arrays.asList(new TypeReference<Uint256>() {
            }, new TypeReference<Uint256>() {
            }, new TypeReference<Uint256>() {
            }, new TypeReference<Uint256>() {
            }));

    public static final Event NOOTPTRANSACTIONAUTHORIZED_EVENT = new Event("NoOtpTransactionAuthorized",
            Arrays.asList(new TypeReference<Uint256>(true) {
            }, new TypeReference<Uint256>() {
            }));

    public static final Event OTPSTATESET_EVENT = new Event("OtpStateSet",
            Arrays.asList(new TypeReference<Bytes16>() {
            }, new TypeReference<Uint16>() {
            }));

    public static final Event OWNERSET_EVENT = new Event("OwnerSet",
            List.of(new TypeReference<Address>() {
            }));

    public static final Event PENDINGREFUNDSAVED_EVENT = new Event("PendingRefundSaved",
            Arrays.asList(new TypeReference<Uint256>(true) {
            }, new TypeReference<Uint256>() {
            }));

    public static final Event PROCESSORSET_EVENT = new Event("ProcessorSet",
            Arrays.asList(new TypeReference<Address>() {
            }, new TypeReference<Address>() {
            }));

    public static final Event REFUNDPAID_EVENT = new Event("RefundPaid",
            Arrays.asList(new TypeReference<Uint256>(true) {
            }, new TypeReference<Uint256>() {
            }));

    public static final Event TRANSACTIONAMOUNTCHANGED_EVENT = new Event("TransactionAmountChanged",
            Arrays.asList(new TypeReference<Uint256>(true) {
            }, new TypeReference<Uint256>() {
            }));

    public static final Event TRANSACTIONAUTHORIZED_EVENT = new Event("TransactionAuthorized",
            Arrays.asList(new TypeReference<Uint256>(true) {
            }, new TypeReference<Uint256>() {
            }, new TypeReference<Bytes16>() {
            }, new TypeReference<Uint16>() {
            }));

    public static final Event TRANSACTIONSETTLED_EVENT = new Event("TransactionSettled",
            Arrays.asList(new TypeReference<Uint256>(true) {
            }, new TypeReference<Uint256>() {
            }, new TypeReference<Uint256>() {
            }));

    public static final Event UNSETTLEDTRANSACTIONUNBLOCKED_EVENT = new Event("UnsettledTransactionUnblocked",
            Arrays.asList(new TypeReference<Uint256>(true) {
            }, new TypeReference<Uint256>() {
            }));

    public static final Event UPGRADED_EVENT = new Event("Upgraded",
            List.of(new TypeReference<Address>(true) {
            }));

    public static final Event VERIFIEDBALANCEINCREASED_EVENT = new Event("VerifiedBalanceIncreased",
            Arrays.asList(new TypeReference<Uint256>() {
            }, new TypeReference<Uint256>() {
            }));

    public static final Event VERIFIEDBALANCESET_EVENT = new Event("VerifiedBalanceSet",
            List.of(new TypeReference<Uint256>() {
            }));

    public static final Event WITHDRAWALCANCELED_EVENT = new Event("WithdrawalCanceled",
            List.of());

    public static final Event WITHDRAWALCOMPLETE_EVENT = new Event("WithdrawalComplete",
            Arrays.asList(new TypeReference<Address>(true) {
            }, new TypeReference<Uint256>() {
            }));

    public static final Event WITHDRAWALINITIATED_EVENT = new Event("WithdrawalInitiated",
            Arrays.asList(new TypeReference<Uint256>() {
            }, new TypeReference<Uint256>() {
            }));

    @Deprecated
    protected TangemPaymentAccount(String contractAddress, Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) {
        super(BINARY, contractAddress, web3j, credentials, gasPrice, gasLimit);
    }

    protected TangemPaymentAccount(String contractAddress, Web3j web3j, Credentials credentials, ContractGasProvider contractGasProvider) {
        super(BINARY, contractAddress, web3j, credentials, contractGasProvider);
    }

    @Deprecated
    protected TangemPaymentAccount(String contractAddress, Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit) {
        super(BINARY, contractAddress, web3j, transactionManager, gasPrice, gasLimit);
    }

    protected TangemPaymentAccount(String contractAddress, Web3j web3j, TransactionManager transactionManager, ContractGasProvider contractGasProvider) {
        super(BINARY, contractAddress, web3j, transactionManager, contractGasProvider);
    }

    public static List<AccountStateAfterSettlementEventResponse> getAccountStateAfterSettlementEvents(TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList = staticExtractEventParametersWithLog(ACCOUNTSTATEAFTERSETTLEMENT_EVENT, transactionReceipt);
        ArrayList<AccountStateAfterSettlementEventResponse> responses = new ArrayList<AccountStateAfterSettlementEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            AccountStateAfterSettlementEventResponse typedResponse = new AccountStateAfterSettlementEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.balance = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
            typedResponse.blockedAmount = (BigInteger) eventValues.getNonIndexedValues().get(1).getValue();
            typedResponse.debtTotal = (BigInteger) eventValues.getNonIndexedValues().get(2).getValue();
            typedResponse.pendingRefundTotal = (BigInteger) eventValues.getNonIndexedValues().get(3).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public static AccountStateAfterSettlementEventResponse getAccountStateAfterSettlementEventFromLog(Log log) {
        EventValuesWithLog eventValues = staticExtractEventParametersWithLog(ACCOUNTSTATEAFTERSETTLEMENT_EVENT, log);
        AccountStateAfterSettlementEventResponse typedResponse = new AccountStateAfterSettlementEventResponse();
        typedResponse.log = log;
        typedResponse.balance = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
        typedResponse.blockedAmount = (BigInteger) eventValues.getNonIndexedValues().get(1).getValue();
        typedResponse.debtTotal = (BigInteger) eventValues.getNonIndexedValues().get(2).getValue();
        typedResponse.pendingRefundTotal = (BigInteger) eventValues.getNonIndexedValues().get(3).getValue();
        return typedResponse;
    }

    public static CardSetEventResponse getCardSetEventFromLog(Log log) {
        EventValuesWithLog eventValues = staticExtractEventParametersWithLog(CARDSET_EVENT, log);
        CardSetEventResponse typedResponse = new CardSetEventResponse();
        typedResponse.log = log;
        typedResponse.card = (String) eventValues.getNonIndexedValues().get(0).getValue();
        typedResponse.otpRoot = (byte[]) eventValues.getNonIndexedValues().get(1).getValue();
        typedResponse.otpCounter = (BigInteger) eventValues.getNonIndexedValues().get(2).getValue();
        return typedResponse;
    }

    public static DebtIncreasedEventResponse getDebtIncreasedEventFromLog(Log log) {
        EventValuesWithLog eventValues = staticExtractEventParametersWithLog(DEBTINCREASED_EVENT, log);
        DebtIncreasedEventResponse typedResponse = new DebtIncreasedEventResponse();
        typedResponse.log = log;
        typedResponse.increase = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
        typedResponse.debtAmount = (BigInteger) eventValues.getNonIndexedValues().get(1).getValue();
        return typedResponse;
    }

    public static List<CardSetEventResponse> getCardSetEvents(TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList = staticExtractEventParametersWithLog(CARDSET_EVENT, transactionReceipt);
        ArrayList<CardSetEventResponse> responses = new ArrayList<CardSetEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            CardSetEventResponse typedResponse = new CardSetEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.card = (String) eventValues.getNonIndexedValues().get(0).getValue();
            typedResponse.otpRoot = (byte[]) eventValues.getNonIndexedValues().get(1).getValue();
            typedResponse.otpCounter = (BigInteger) eventValues.getNonIndexedValues().get(2).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public static DebtPaidEventResponse getDebtPaidEventFromLog(Log log) {
        EventValuesWithLog eventValues = staticExtractEventParametersWithLog(DEBTPAID_EVENT, log);
        DebtPaidEventResponse typedResponse = new DebtPaidEventResponse();
        typedResponse.log = log;
        typedResponse.paid = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
        typedResponse.debtLeft = (BigInteger) eventValues.getNonIndexedValues().get(1).getValue();
        return typedResponse;
    }

    public static DebtWrittenOffEventResponse getDebtWrittenOffEventFromLog(Log log) {
        EventValuesWithLog eventValues = staticExtractEventParametersWithLog(DEBTWRITTENOFF_EVENT, log);
        DebtWrittenOffEventResponse typedResponse = new DebtWrittenOffEventResponse();
        typedResponse.log = log;
        typedResponse.writtenOff = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
        typedResponse.debtLeft = (BigInteger) eventValues.getNonIndexedValues().get(1).getValue();
        return typedResponse;
    }

    public static List<EIP712DomainChangedEventResponse> getEIP712DomainChangedEvents(TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList = staticExtractEventParametersWithLog(EIP712DOMAINCHANGED_EVENT, transactionReceipt);
        ArrayList<EIP712DomainChangedEventResponse> responses = new ArrayList<EIP712DomainChangedEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            EIP712DomainChangedEventResponse typedResponse = new EIP712DomainChangedEventResponse();
            typedResponse.log = eventValues.getLog();
            responses.add(typedResponse);
        }
        return responses;
    }

    public static List<DebtIncreasedEventResponse> getDebtIncreasedEvents(TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList = staticExtractEventParametersWithLog(DEBTINCREASED_EVENT, transactionReceipt);
        ArrayList<DebtIncreasedEventResponse> responses = new ArrayList<DebtIncreasedEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            DebtIncreasedEventResponse typedResponse = new DebtIncreasedEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.increase = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
            typedResponse.debtAmount = (BigInteger) eventValues.getNonIndexedValues().get(1).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public static EIP712DomainChangedEventResponse getEIP712DomainChangedEventFromLog(Log log) {
        EventValuesWithLog eventValues = staticExtractEventParametersWithLog(EIP712DOMAINCHANGED_EVENT, log);
        EIP712DomainChangedEventResponse typedResponse = new EIP712DomainChangedEventResponse();
        typedResponse.log = log;
        return typedResponse;
    }

    public static InitializedEventResponse getInitializedEventFromLog(Log log) {
        EventValuesWithLog eventValues = staticExtractEventParametersWithLog(INITIALIZED_EVENT, log);
        InitializedEventResponse typedResponse = new InitializedEventResponse();
        typedResponse.log = log;
        typedResponse.version = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
        return typedResponse;
    }

    public static InsufficientFundsOnForcedAuthEventResponse getInsufficientFundsOnForcedAuthEventFromLog(Log log) {
        EventValuesWithLog eventValues = staticExtractEventParametersWithLog(INSUFFICIENTFUNDSONFORCEDAUTH_EVENT, log);
        InsufficientFundsOnForcedAuthEventResponse typedResponse = new InsufficientFundsOnForcedAuthEventResponse();
        typedResponse.log = log;
        typedResponse.transactionId = (BigInteger) eventValues.getIndexedValues().get(0).getValue();
        typedResponse.insufficientAmount = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
        return typedResponse;
    }

    public static List<DebtPaidEventResponse> getDebtPaidEvents(TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList = staticExtractEventParametersWithLog(DEBTPAID_EVENT, transactionReceipt);
        ArrayList<DebtPaidEventResponse> responses = new ArrayList<DebtPaidEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            DebtPaidEventResponse typedResponse = new DebtPaidEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.paid = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
            typedResponse.debtLeft = (BigInteger) eventValues.getNonIndexedValues().get(1).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public static LimitsSetEventResponse getLimitsSetEventFromLog(Log log) {
        EventValuesWithLog eventValues = staticExtractEventParametersWithLog(LIMITSSET_EVENT, log);
        LimitsSetEventResponse typedResponse = new LimitsSetEventResponse();
        typedResponse.log = log;
        typedResponse.singleTransactionLimit = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
        typedResponse.spendLimit = (BigInteger) eventValues.getNonIndexedValues().get(1).getValue();
        typedResponse.noOtpSpendLimit = (BigInteger) eventValues.getNonIndexedValues().get(2).getValue();
        typedResponse.spendLimitsPeriod = (BigInteger) eventValues.getNonIndexedValues().get(3).getValue();
        return typedResponse;
    }

    public static NoOtpTransactionAuthorizedEventResponse getNoOtpTransactionAuthorizedEventFromLog(Log log) {
        EventValuesWithLog eventValues = staticExtractEventParametersWithLog(NOOTPTRANSACTIONAUTHORIZED_EVENT, log);
        NoOtpTransactionAuthorizedEventResponse typedResponse = new NoOtpTransactionAuthorizedEventResponse();
        typedResponse.log = log;
        typedResponse.transactionId = (BigInteger) eventValues.getIndexedValues().get(0).getValue();
        typedResponse.amount = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
        return typedResponse;
    }

    public static OtpStateSetEventResponse getOtpStateSetEventFromLog(Log log) {
        EventValuesWithLog eventValues = staticExtractEventParametersWithLog(OTPSTATESET_EVENT, log);
        OtpStateSetEventResponse typedResponse = new OtpStateSetEventResponse();
        typedResponse.log = log;
        typedResponse.otpRoot = (byte[]) eventValues.getNonIndexedValues().get(0).getValue();
        typedResponse.otpCounter = (BigInteger) eventValues.getNonIndexedValues().get(1).getValue();
        return typedResponse;
    }

    public static List<DebtWrittenOffEventResponse> getDebtWrittenOffEvents(TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList = staticExtractEventParametersWithLog(DEBTWRITTENOFF_EVENT, transactionReceipt);
        ArrayList<DebtWrittenOffEventResponse> responses = new ArrayList<DebtWrittenOffEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            DebtWrittenOffEventResponse typedResponse = new DebtWrittenOffEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.writtenOff = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
            typedResponse.debtLeft = (BigInteger) eventValues.getNonIndexedValues().get(1).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public static List<OwnerSetEventResponse> getOwnerSetEvents(TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList = staticExtractEventParametersWithLog(OWNERSET_EVENT, transactionReceipt);
        ArrayList<OwnerSetEventResponse> responses = new ArrayList<OwnerSetEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            OwnerSetEventResponse typedResponse = new OwnerSetEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.owner = (String) eventValues.getNonIndexedValues().get(0).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public static OwnerSetEventResponse getOwnerSetEventFromLog(Log log) {
        EventValuesWithLog eventValues = staticExtractEventParametersWithLog(OWNERSET_EVENT, log);
        OwnerSetEventResponse typedResponse = new OwnerSetEventResponse();
        typedResponse.log = log;
        typedResponse.owner = (String) eventValues.getNonIndexedValues().get(0).getValue();
        return typedResponse;
    }

    public static PendingRefundSavedEventResponse getPendingRefundSavedEventFromLog(Log log) {
        EventValuesWithLog eventValues = staticExtractEventParametersWithLog(PENDINGREFUNDSAVED_EVENT, log);
        PendingRefundSavedEventResponse typedResponse = new PendingRefundSavedEventResponse();
        typedResponse.log = log;
        typedResponse.transactionId = (BigInteger) eventValues.getIndexedValues().get(0).getValue();
        typedResponse.amount = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
        return typedResponse;
    }

    public static ProcessorSetEventResponse getProcessorSetEventFromLog(Log log) {
        EventValuesWithLog eventValues = staticExtractEventParametersWithLog(PROCESSORSET_EVENT, log);
        ProcessorSetEventResponse typedResponse = new ProcessorSetEventResponse();
        typedResponse.log = log;
        typedResponse.processor = (String) eventValues.getNonIndexedValues().get(0).getValue();
        typedResponse.paymentToken = (String) eventValues.getNonIndexedValues().get(1).getValue();
        return typedResponse;
    }

    public static RefundPaidEventResponse getRefundPaidEventFromLog(Log log) {
        EventValuesWithLog eventValues = staticExtractEventParametersWithLog(REFUNDPAID_EVENT, log);
        RefundPaidEventResponse typedResponse = new RefundPaidEventResponse();
        typedResponse.log = log;
        typedResponse.transactionId = (BigInteger) eventValues.getIndexedValues().get(0).getValue();
        typedResponse.amount = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
        return typedResponse;
    }

    public static TransactionAmountChangedEventResponse getTransactionAmountChangedEventFromLog(Log log) {
        EventValuesWithLog eventValues = staticExtractEventParametersWithLog(TRANSACTIONAMOUNTCHANGED_EVENT, log);
        TransactionAmountChangedEventResponse typedResponse = new TransactionAmountChangedEventResponse();
        typedResponse.log = log;
        typedResponse.transactionId = (BigInteger) eventValues.getIndexedValues().get(0).getValue();
        typedResponse.newAmount = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
        return typedResponse;
    }

    public static TransactionAuthorizedEventResponse getTransactionAuthorizedEventFromLog(Log log) {
        EventValuesWithLog eventValues = staticExtractEventParametersWithLog(TRANSACTIONAUTHORIZED_EVENT, log);
        TransactionAuthorizedEventResponse typedResponse = new TransactionAuthorizedEventResponse();
        typedResponse.log = log;
        typedResponse.transactionId = (BigInteger) eventValues.getIndexedValues().get(0).getValue();
        typedResponse.amount = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
        typedResponse.otp = (byte[]) eventValues.getNonIndexedValues().get(1).getValue();
        typedResponse.otpCounter = (BigInteger) eventValues.getNonIndexedValues().get(2).getValue();
        return typedResponse;
    }

    public static List<InitializedEventResponse> getInitializedEvents(TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList = staticExtractEventParametersWithLog(INITIALIZED_EVENT, transactionReceipt);
        ArrayList<InitializedEventResponse> responses = new ArrayList<InitializedEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            InitializedEventResponse typedResponse = new InitializedEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.version = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public static TransactionSettledEventResponse getTransactionSettledEventFromLog(Log log) {
        EventValuesWithLog eventValues = staticExtractEventParametersWithLog(TRANSACTIONSETTLED_EVENT, log);
        TransactionSettledEventResponse typedResponse = new TransactionSettledEventResponse();
        typedResponse.log = log;
        typedResponse.transactionId = (BigInteger) eventValues.getIndexedValues().get(0).getValue();
        typedResponse.settlementAmount = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
        typedResponse.paymentAmount = (BigInteger) eventValues.getNonIndexedValues().get(1).getValue();
        return typedResponse;
    }

    public static UnsettledTransactionUnblockedEventResponse getUnsettledTransactionUnblockedEventFromLog(Log log) {
        EventValuesWithLog eventValues = staticExtractEventParametersWithLog(UNSETTLEDTRANSACTIONUNBLOCKED_EVENT, log);
        UnsettledTransactionUnblockedEventResponse typedResponse = new UnsettledTransactionUnblockedEventResponse();
        typedResponse.log = log;
        typedResponse.transactionId = (BigInteger) eventValues.getIndexedValues().get(0).getValue();
        typedResponse.amount = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
        return typedResponse;
    }

    public static UpgradedEventResponse getUpgradedEventFromLog(Log log) {
        EventValuesWithLog eventValues = staticExtractEventParametersWithLog(UPGRADED_EVENT, log);
        UpgradedEventResponse typedResponse = new UpgradedEventResponse();
        typedResponse.log = log;
        typedResponse.implementation = (String) eventValues.getIndexedValues().get(0).getValue();
        return typedResponse;
    }

    public static List<InsufficientFundsOnForcedAuthEventResponse> getInsufficientFundsOnForcedAuthEvents(TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList = staticExtractEventParametersWithLog(INSUFFICIENTFUNDSONFORCEDAUTH_EVENT, transactionReceipt);
        ArrayList<InsufficientFundsOnForcedAuthEventResponse> responses = new ArrayList<InsufficientFundsOnForcedAuthEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            InsufficientFundsOnForcedAuthEventResponse typedResponse = new InsufficientFundsOnForcedAuthEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.transactionId = (BigInteger) eventValues.getIndexedValues().get(0).getValue();
            typedResponse.insufficientAmount = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public static VerifiedBalanceIncreasedEventResponse getVerifiedBalanceIncreasedEventFromLog(Log log) {
        EventValuesWithLog eventValues = staticExtractEventParametersWithLog(VERIFIEDBALANCEINCREASED_EVENT, log);
        VerifiedBalanceIncreasedEventResponse typedResponse = new VerifiedBalanceIncreasedEventResponse();
        typedResponse.log = log;
        typedResponse.increase = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
        typedResponse.verifiedBalance = (BigInteger) eventValues.getNonIndexedValues().get(1).getValue();
        return typedResponse;
    }

    public static VerifiedBalanceSetEventResponse getVerifiedBalanceSetEventFromLog(Log log) {
        EventValuesWithLog eventValues = staticExtractEventParametersWithLog(VERIFIEDBALANCESET_EVENT, log);
        VerifiedBalanceSetEventResponse typedResponse = new VerifiedBalanceSetEventResponse();
        typedResponse.log = log;
        typedResponse.verifiedBalance = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
        return typedResponse;
    }

    public static WithdrawalCanceledEventResponse getWithdrawalCanceledEventFromLog(Log log) {
        EventValuesWithLog eventValues = staticExtractEventParametersWithLog(WITHDRAWALCANCELED_EVENT, log);
        WithdrawalCanceledEventResponse typedResponse = new WithdrawalCanceledEventResponse();
        typedResponse.log = log;
        return typedResponse;
    }

    public static List<LimitsSetEventResponse> getLimitsSetEvents(TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList = staticExtractEventParametersWithLog(LIMITSSET_EVENT, transactionReceipt);
        ArrayList<LimitsSetEventResponse> responses = new ArrayList<LimitsSetEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            LimitsSetEventResponse typedResponse = new LimitsSetEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.singleTransactionLimit = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
            typedResponse.spendLimit = (BigInteger) eventValues.getNonIndexedValues().get(1).getValue();
            typedResponse.noOtpSpendLimit = (BigInteger) eventValues.getNonIndexedValues().get(2).getValue();
            typedResponse.spendLimitsPeriod = (BigInteger) eventValues.getNonIndexedValues().get(3).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public static WithdrawalCompleteEventResponse getWithdrawalCompleteEventFromLog(Log log) {
        EventValuesWithLog eventValues = staticExtractEventParametersWithLog(WITHDRAWALCOMPLETE_EVENT, log);
        WithdrawalCompleteEventResponse typedResponse = new WithdrawalCompleteEventResponse();
        typedResponse.log = log;
        typedResponse.to = (String) eventValues.getIndexedValues().get(0).getValue();
        typedResponse.amount = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
        return typedResponse;
    }

    @Deprecated
    public static TangemPaymentAccount load(String contractAddress, Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit) {
        return new TangemPaymentAccount(contractAddress, web3j, credentials, gasPrice, gasLimit);
    }

    @Deprecated
    public static TangemPaymentAccount load(String contractAddress, Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit) {
        return new TangemPaymentAccount(contractAddress, web3j, transactionManager, gasPrice, gasLimit);
    }

    public static List<NoOtpTransactionAuthorizedEventResponse> getNoOtpTransactionAuthorizedEvents(TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList = staticExtractEventParametersWithLog(NOOTPTRANSACTIONAUTHORIZED_EVENT, transactionReceipt);
        ArrayList<NoOtpTransactionAuthorizedEventResponse> responses = new ArrayList<NoOtpTransactionAuthorizedEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            NoOtpTransactionAuthorizedEventResponse typedResponse = new NoOtpTransactionAuthorizedEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.transactionId = (BigInteger) eventValues.getIndexedValues().get(0).getValue();
            typedResponse.amount = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public static TangemPaymentAccount load(String contractAddress, Web3j web3j, Credentials credentials, ContractGasProvider contractGasProvider) {
        return new TangemPaymentAccount(contractAddress, web3j, credentials, contractGasProvider);
    }

    public static TangemPaymentAccount load(String contractAddress, Web3j web3j, TransactionManager transactionManager, ContractGasProvider contractGasProvider) {
        return new TangemPaymentAccount(contractAddress, web3j, transactionManager, contractGasProvider);
    }

    public static RemoteCall<TangemPaymentAccount> deploy(Web3j web3j, Credentials credentials, ContractGasProvider contractGasProvider, String trustedForwarder) {
        String encodedConstructor = FunctionEncoder.encodeConstructor(List.of(new Address(160, trustedForwarder)));
        return deployRemoteCall(TangemPaymentAccount.class, web3j, credentials, contractGasProvider, BINARY, encodedConstructor);
    }

    public static List<OtpStateSetEventResponse> getOtpStateSetEvents(TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList = staticExtractEventParametersWithLog(OTPSTATESET_EVENT, transactionReceipt);
        ArrayList<OtpStateSetEventResponse> responses = new ArrayList<OtpStateSetEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            OtpStateSetEventResponse typedResponse = new OtpStateSetEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.otpRoot = (byte[]) eventValues.getNonIndexedValues().get(0).getValue();
            typedResponse.otpCounter = (BigInteger) eventValues.getNonIndexedValues().get(1).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public static RemoteCall<TangemPaymentAccount> deploy(Web3j web3j, TransactionManager transactionManager, ContractGasProvider contractGasProvider, String trustedForwarder) {
        String encodedConstructor = FunctionEncoder.encodeConstructor(List.of(new Address(160, trustedForwarder)));
        return deployRemoteCall(TangemPaymentAccount.class, web3j, transactionManager, contractGasProvider, BINARY, encodedConstructor);
    }

    @Deprecated
    public static RemoteCall<TangemPaymentAccount> deploy(Web3j web3j, Credentials credentials, BigInteger gasPrice, BigInteger gasLimit, String trustedForwarder) {
        String encodedConstructor = FunctionEncoder.encodeConstructor(List.of(new Address(160, trustedForwarder)));
        return deployRemoteCall(TangemPaymentAccount.class, web3j, credentials, gasPrice, gasLimit, BINARY, encodedConstructor);
    }

    @Deprecated
    public static RemoteCall<TangemPaymentAccount> deploy(Web3j web3j, TransactionManager transactionManager, BigInteger gasPrice, BigInteger gasLimit, String trustedForwarder) {
        String encodedConstructor = FunctionEncoder.encodeConstructor(List.of(new Address(160, trustedForwarder)));
        return deployRemoteCall(TangemPaymentAccount.class, web3j, transactionManager, gasPrice, gasLimit, BINARY, encodedConstructor);
    }

    public Flowable<AccountStateAfterSettlementEventResponse> accountStateAfterSettlementEventFlowable(EthFilter filter) {
        return web3j.ethLogFlowable(filter).map(log -> getAccountStateAfterSettlementEventFromLog(log));
    }

    public Flowable<AccountStateAfterSettlementEventResponse> accountStateAfterSettlementEventFlowable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) {
        EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress());
        filter.addSingleTopic(EventEncoder.encode(ACCOUNTSTATEAFTERSETTLEMENT_EVENT));
        return accountStateAfterSettlementEventFlowable(filter);
    }

    public Flowable<CardSetEventResponse> cardSetEventFlowable(EthFilter filter) {
        return web3j.ethLogFlowable(filter).map(log -> getCardSetEventFromLog(log));
    }

    public Flowable<CardSetEventResponse> cardSetEventFlowable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) {
        EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress());
        filter.addSingleTopic(EventEncoder.encode(CARDSET_EVENT));
        return cardSetEventFlowable(filter);
    }

    public static List<PendingRefundSavedEventResponse> getPendingRefundSavedEvents(TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList = staticExtractEventParametersWithLog(PENDINGREFUNDSAVED_EVENT, transactionReceipt);
        ArrayList<PendingRefundSavedEventResponse> responses = new ArrayList<PendingRefundSavedEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            PendingRefundSavedEventResponse typedResponse = new PendingRefundSavedEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.transactionId = (BigInteger) eventValues.getIndexedValues().get(0).getValue();
            typedResponse.amount = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public Flowable<DebtIncreasedEventResponse> debtIncreasedEventFlowable(EthFilter filter) {
        return web3j.ethLogFlowable(filter).map(log -> getDebtIncreasedEventFromLog(log));
    }

    public Flowable<DebtIncreasedEventResponse> debtIncreasedEventFlowable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) {
        EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress());
        filter.addSingleTopic(EventEncoder.encode(DEBTINCREASED_EVENT));
        return debtIncreasedEventFlowable(filter);
    }

    public Flowable<DebtPaidEventResponse> debtPaidEventFlowable(EthFilter filter) {
        return web3j.ethLogFlowable(filter).map(log -> getDebtPaidEventFromLog(log));
    }

    public static List<ProcessorSetEventResponse> getProcessorSetEvents(TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList = staticExtractEventParametersWithLog(PROCESSORSET_EVENT, transactionReceipt);
        ArrayList<ProcessorSetEventResponse> responses = new ArrayList<ProcessorSetEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            ProcessorSetEventResponse typedResponse = new ProcessorSetEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.processor = (String) eventValues.getNonIndexedValues().get(0).getValue();
            typedResponse.paymentToken = (String) eventValues.getNonIndexedValues().get(1).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public Flowable<DebtPaidEventResponse> debtPaidEventFlowable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) {
        EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress());
        filter.addSingleTopic(EventEncoder.encode(DEBTPAID_EVENT));
        return debtPaidEventFlowable(filter);
    }

    public Flowable<DebtWrittenOffEventResponse> debtWrittenOffEventFlowable(EthFilter filter) {
        return web3j.ethLogFlowable(filter).map(log -> getDebtWrittenOffEventFromLog(log));
    }

    public Flowable<DebtWrittenOffEventResponse> debtWrittenOffEventFlowable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) {
        EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress());
        filter.addSingleTopic(EventEncoder.encode(DEBTWRITTENOFF_EVENT));
        return debtWrittenOffEventFlowable(filter);
    }

    public static List<RefundPaidEventResponse> getRefundPaidEvents(TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList = staticExtractEventParametersWithLog(REFUNDPAID_EVENT, transactionReceipt);
        ArrayList<RefundPaidEventResponse> responses = new ArrayList<RefundPaidEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            RefundPaidEventResponse typedResponse = new RefundPaidEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.transactionId = (BigInteger) eventValues.getIndexedValues().get(0).getValue();
            typedResponse.amount = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public Flowable<EIP712DomainChangedEventResponse> eIP712DomainChangedEventFlowable(EthFilter filter) {
        return web3j.ethLogFlowable(filter).map(log -> getEIP712DomainChangedEventFromLog(log));
    }

    public Flowable<EIP712DomainChangedEventResponse> eIP712DomainChangedEventFlowable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) {
        EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress());
        filter.addSingleTopic(EventEncoder.encode(EIP712DOMAINCHANGED_EVENT));
        return eIP712DomainChangedEventFlowable(filter);
    }

    public Flowable<InitializedEventResponse> initializedEventFlowable(EthFilter filter) {
        return web3j.ethLogFlowable(filter).map(log -> getInitializedEventFromLog(log));
    }

    public static List<TransactionAmountChangedEventResponse> getTransactionAmountChangedEvents(TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList = staticExtractEventParametersWithLog(TRANSACTIONAMOUNTCHANGED_EVENT, transactionReceipt);
        ArrayList<TransactionAmountChangedEventResponse> responses = new ArrayList<TransactionAmountChangedEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            TransactionAmountChangedEventResponse typedResponse = new TransactionAmountChangedEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.transactionId = (BigInteger) eventValues.getIndexedValues().get(0).getValue();
            typedResponse.newAmount = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public Flowable<InitializedEventResponse> initializedEventFlowable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) {
        EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress());
        filter.addSingleTopic(EventEncoder.encode(INITIALIZED_EVENT));
        return initializedEventFlowable(filter);
    }

    public Flowable<InsufficientFundsOnForcedAuthEventResponse> insufficientFundsOnForcedAuthEventFlowable(EthFilter filter) {
        return web3j.ethLogFlowable(filter).map(log -> getInsufficientFundsOnForcedAuthEventFromLog(log));
    }

    public Flowable<InsufficientFundsOnForcedAuthEventResponse> insufficientFundsOnForcedAuthEventFlowable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) {
        EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress());
        filter.addSingleTopic(EventEncoder.encode(INSUFFICIENTFUNDSONFORCEDAUTH_EVENT));
        return insufficientFundsOnForcedAuthEventFlowable(filter);
    }

    public static List<TransactionAuthorizedEventResponse> getTransactionAuthorizedEvents(TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList = staticExtractEventParametersWithLog(TRANSACTIONAUTHORIZED_EVENT, transactionReceipt);
        ArrayList<TransactionAuthorizedEventResponse> responses = new ArrayList<TransactionAuthorizedEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            TransactionAuthorizedEventResponse typedResponse = new TransactionAuthorizedEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.transactionId = (BigInteger) eventValues.getIndexedValues().get(0).getValue();
            typedResponse.amount = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
            typedResponse.otp = (byte[]) eventValues.getNonIndexedValues().get(1).getValue();
            typedResponse.otpCounter = (BigInteger) eventValues.getNonIndexedValues().get(2).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public Flowable<LimitsSetEventResponse> limitsSetEventFlowable(EthFilter filter) {
        return web3j.ethLogFlowable(filter).map(log -> getLimitsSetEventFromLog(log));
    }

    public Flowable<LimitsSetEventResponse> limitsSetEventFlowable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) {
        EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress());
        filter.addSingleTopic(EventEncoder.encode(LIMITSSET_EVENT));
        return limitsSetEventFlowable(filter);
    }

    public Flowable<NoOtpTransactionAuthorizedEventResponse> noOtpTransactionAuthorizedEventFlowable(EthFilter filter) {
        return web3j.ethLogFlowable(filter).map(log -> getNoOtpTransactionAuthorizedEventFromLog(log));
    }

    public static List<TransactionSettledEventResponse> getTransactionSettledEvents(TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList = staticExtractEventParametersWithLog(TRANSACTIONSETTLED_EVENT, transactionReceipt);
        ArrayList<TransactionSettledEventResponse> responses = new ArrayList<TransactionSettledEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            TransactionSettledEventResponse typedResponse = new TransactionSettledEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.transactionId = (BigInteger) eventValues.getIndexedValues().get(0).getValue();
            typedResponse.settlementAmount = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
            typedResponse.paymentAmount = (BigInteger) eventValues.getNonIndexedValues().get(1).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public Flowable<NoOtpTransactionAuthorizedEventResponse> noOtpTransactionAuthorizedEventFlowable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) {
        EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress());
        filter.addSingleTopic(EventEncoder.encode(NOOTPTRANSACTIONAUTHORIZED_EVENT));
        return noOtpTransactionAuthorizedEventFlowable(filter);
    }

    public Flowable<OtpStateSetEventResponse> otpStateSetEventFlowable(EthFilter filter) {
        return web3j.ethLogFlowable(filter).map(log -> getOtpStateSetEventFromLog(log));
    }

    public Flowable<OtpStateSetEventResponse> otpStateSetEventFlowable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) {
        EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress());
        filter.addSingleTopic(EventEncoder.encode(OTPSTATESET_EVENT));
        return otpStateSetEventFlowable(filter);
    }

    public static List<UnsettledTransactionUnblockedEventResponse> getUnsettledTransactionUnblockedEvents(TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList = staticExtractEventParametersWithLog(UNSETTLEDTRANSACTIONUNBLOCKED_EVENT, transactionReceipt);
        ArrayList<UnsettledTransactionUnblockedEventResponse> responses = new ArrayList<UnsettledTransactionUnblockedEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            UnsettledTransactionUnblockedEventResponse typedResponse = new UnsettledTransactionUnblockedEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.transactionId = (BigInteger) eventValues.getIndexedValues().get(0).getValue();
            typedResponse.amount = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public Flowable<OwnerSetEventResponse> ownerSetEventFlowable(EthFilter filter) {
        return web3j.ethLogFlowable(filter).map(log -> getOwnerSetEventFromLog(log));
    }

    public Flowable<OwnerSetEventResponse> ownerSetEventFlowable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) {
        EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress());
        filter.addSingleTopic(EventEncoder.encode(OWNERSET_EVENT));
        return ownerSetEventFlowable(filter);
    }

    public Flowable<PendingRefundSavedEventResponse> pendingRefundSavedEventFlowable(EthFilter filter) {
        return web3j.ethLogFlowable(filter).map(log -> getPendingRefundSavedEventFromLog(log));
    }

    public static List<UpgradedEventResponse> getUpgradedEvents(TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList = staticExtractEventParametersWithLog(UPGRADED_EVENT, transactionReceipt);
        ArrayList<UpgradedEventResponse> responses = new ArrayList<UpgradedEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            UpgradedEventResponse typedResponse = new UpgradedEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.implementation = (String) eventValues.getIndexedValues().get(0).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public Flowable<PendingRefundSavedEventResponse> pendingRefundSavedEventFlowable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) {
        EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress());
        filter.addSingleTopic(EventEncoder.encode(PENDINGREFUNDSAVED_EVENT));
        return pendingRefundSavedEventFlowable(filter);
    }

    public Flowable<ProcessorSetEventResponse> processorSetEventFlowable(EthFilter filter) {
        return web3j.ethLogFlowable(filter).map(log -> getProcessorSetEventFromLog(log));
    }

    public Flowable<ProcessorSetEventResponse> processorSetEventFlowable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) {
        EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress());
        filter.addSingleTopic(EventEncoder.encode(PROCESSORSET_EVENT));
        return processorSetEventFlowable(filter);
    }

    public static List<VerifiedBalanceIncreasedEventResponse> getVerifiedBalanceIncreasedEvents(TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList = staticExtractEventParametersWithLog(VERIFIEDBALANCEINCREASED_EVENT, transactionReceipt);
        ArrayList<VerifiedBalanceIncreasedEventResponse> responses = new ArrayList<VerifiedBalanceIncreasedEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            VerifiedBalanceIncreasedEventResponse typedResponse = new VerifiedBalanceIncreasedEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.increase = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
            typedResponse.verifiedBalance = (BigInteger) eventValues.getNonIndexedValues().get(1).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public Flowable<RefundPaidEventResponse> refundPaidEventFlowable(EthFilter filter) {
        return web3j.ethLogFlowable(filter).map(log -> getRefundPaidEventFromLog(log));
    }

    public Flowable<RefundPaidEventResponse> refundPaidEventFlowable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) {
        EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress());
        filter.addSingleTopic(EventEncoder.encode(REFUNDPAID_EVENT));
        return refundPaidEventFlowable(filter);
    }

    public Flowable<TransactionAmountChangedEventResponse> transactionAmountChangedEventFlowable(EthFilter filter) {
        return web3j.ethLogFlowable(filter).map(log -> getTransactionAmountChangedEventFromLog(log));
    }

    public static List<VerifiedBalanceSetEventResponse> getVerifiedBalanceSetEvents(TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList = staticExtractEventParametersWithLog(VERIFIEDBALANCESET_EVENT, transactionReceipt);
        ArrayList<VerifiedBalanceSetEventResponse> responses = new ArrayList<VerifiedBalanceSetEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            VerifiedBalanceSetEventResponse typedResponse = new VerifiedBalanceSetEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.verifiedBalance = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public Flowable<TransactionAmountChangedEventResponse> transactionAmountChangedEventFlowable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) {
        EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress());
        filter.addSingleTopic(EventEncoder.encode(TRANSACTIONAMOUNTCHANGED_EVENT));
        return transactionAmountChangedEventFlowable(filter);
    }

    public Flowable<TransactionAuthorizedEventResponse> transactionAuthorizedEventFlowable(EthFilter filter) {
        return web3j.ethLogFlowable(filter).map(log -> getTransactionAuthorizedEventFromLog(log));
    }

    public Flowable<TransactionAuthorizedEventResponse> transactionAuthorizedEventFlowable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) {
        EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress());
        filter.addSingleTopic(EventEncoder.encode(TRANSACTIONAUTHORIZED_EVENT));
        return transactionAuthorizedEventFlowable(filter);
    }

    public static List<WithdrawalCanceledEventResponse> getWithdrawalCanceledEvents(TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList = staticExtractEventParametersWithLog(WITHDRAWALCANCELED_EVENT, transactionReceipt);
        ArrayList<WithdrawalCanceledEventResponse> responses = new ArrayList<WithdrawalCanceledEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            WithdrawalCanceledEventResponse typedResponse = new WithdrawalCanceledEventResponse();
            typedResponse.log = eventValues.getLog();
            responses.add(typedResponse);
        }
        return responses;
    }

    public Flowable<TransactionSettledEventResponse> transactionSettledEventFlowable(EthFilter filter) {
        return web3j.ethLogFlowable(filter).map(log -> getTransactionSettledEventFromLog(log));
    }

    public Flowable<TransactionSettledEventResponse> transactionSettledEventFlowable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) {
        EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress());
        filter.addSingleTopic(EventEncoder.encode(TRANSACTIONSETTLED_EVENT));
        return transactionSettledEventFlowable(filter);
    }

    public Flowable<UnsettledTransactionUnblockedEventResponse> unsettledTransactionUnblockedEventFlowable(EthFilter filter) {
        return web3j.ethLogFlowable(filter).map(log -> getUnsettledTransactionUnblockedEventFromLog(log));
    }

    public static List<WithdrawalCompleteEventResponse> getWithdrawalCompleteEvents(TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList = staticExtractEventParametersWithLog(WITHDRAWALCOMPLETE_EVENT, transactionReceipt);
        ArrayList<WithdrawalCompleteEventResponse> responses = new ArrayList<WithdrawalCompleteEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            WithdrawalCompleteEventResponse typedResponse = new WithdrawalCompleteEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.to = (String) eventValues.getIndexedValues().get(0).getValue();
            typedResponse.amount = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public Flowable<UnsettledTransactionUnblockedEventResponse> unsettledTransactionUnblockedEventFlowable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) {
        EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress());
        filter.addSingleTopic(EventEncoder.encode(UNSETTLEDTRANSACTIONUNBLOCKED_EVENT));
        return unsettledTransactionUnblockedEventFlowable(filter);
    }

    public Flowable<UpgradedEventResponse> upgradedEventFlowable(EthFilter filter) {
        return web3j.ethLogFlowable(filter).map(log -> getUpgradedEventFromLog(log));
    }

    public Flowable<UpgradedEventResponse> upgradedEventFlowable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) {
        EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress());
        filter.addSingleTopic(EventEncoder.encode(UPGRADED_EVENT));
        return upgradedEventFlowable(filter);
    }

    public static List<WithdrawalInitiatedEventResponse> getWithdrawalInitiatedEvents(TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList = staticExtractEventParametersWithLog(WITHDRAWALINITIATED_EVENT, transactionReceipt);
        ArrayList<WithdrawalInitiatedEventResponse> responses = new ArrayList<WithdrawalInitiatedEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            WithdrawalInitiatedEventResponse typedResponse = new WithdrawalInitiatedEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.amount = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
            typedResponse.readyToWithdrawTimestamp = (BigInteger) eventValues.getNonIndexedValues().get(1).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public static WithdrawalInitiatedEventResponse getWithdrawalInitiatedEventFromLog(Log log) {
        EventValuesWithLog eventValues = staticExtractEventParametersWithLog(WITHDRAWALINITIATED_EVENT, log);
        WithdrawalInitiatedEventResponse typedResponse = new WithdrawalInitiatedEventResponse();
        typedResponse.log = log;
        typedResponse.amount = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
        typedResponse.readyToWithdrawTimestamp = (BigInteger) eventValues.getNonIndexedValues().get(1).getValue();
        return typedResponse;
    }

    public Flowable<WithdrawalInitiatedEventResponse> withdrawalInitiatedEventFlowable(EthFilter filter) {
        return web3j.ethLogFlowable(filter).map(log -> getWithdrawalInitiatedEventFromLog(log));
    }

    public Flowable<WithdrawalInitiatedEventResponse> withdrawalInitiatedEventFlowable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) {
        EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress());
        filter.addSingleTopic(EventEncoder.encode(WITHDRAWALINITIATED_EVENT));
        return withdrawalInitiatedEventFlowable(filter);
    }

    public Flowable<VerifiedBalanceIncreasedEventResponse> verifiedBalanceIncreasedEventFlowable(EthFilter filter) {
        return web3j.ethLogFlowable(filter).map(log -> getVerifiedBalanceIncreasedEventFromLog(log));
    }

    public Flowable<VerifiedBalanceIncreasedEventResponse> verifiedBalanceIncreasedEventFlowable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) {
        EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress());
        filter.addSingleTopic(EventEncoder.encode(VERIFIEDBALANCEINCREASED_EVENT));
        return verifiedBalanceIncreasedEventFlowable(filter);
    }

    public Flowable<VerifiedBalanceSetEventResponse> verifiedBalanceSetEventFlowable(EthFilter filter) {
        return web3j.ethLogFlowable(filter).map(log -> getVerifiedBalanceSetEventFromLog(log));
    }

    public Flowable<VerifiedBalanceSetEventResponse> verifiedBalanceSetEventFlowable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) {
        EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress());
        filter.addSingleTopic(EventEncoder.encode(VERIFIEDBALANCESET_EVENT));
        return verifiedBalanceSetEventFlowable(filter);
    }

    public Flowable<WithdrawalCanceledEventResponse> withdrawalCanceledEventFlowable(EthFilter filter) {
        return web3j.ethLogFlowable(filter).map(log -> getWithdrawalCanceledEventFromLog(log));
    }

    public Flowable<WithdrawalCanceledEventResponse> withdrawalCanceledEventFlowable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) {
        EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress());
        filter.addSingleTopic(EventEncoder.encode(WITHDRAWALCANCELED_EVENT));
        return withdrawalCanceledEventFlowable(filter);
    }

    public Flowable<WithdrawalCompleteEventResponse> withdrawalCompleteEventFlowable(EthFilter filter) {
        return web3j.ethLogFlowable(filter).map(log -> getWithdrawalCompleteEventFromLog(log));
    }

    public Flowable<WithdrawalCompleteEventResponse> withdrawalCompleteEventFlowable(DefaultBlockParameter startBlock, DefaultBlockParameter endBlock) {
        EthFilter filter = new EthFilter(startBlock, endBlock, getContractAddress());
        filter.addSingleTopic(EventEncoder.encode(WITHDRAWALCOMPLETE_EVENT));
        return withdrawalCompleteEventFlowable(filter);
    }

    public RemoteFunctionCall<String> UPGRADE_INTERFACE_VERSION() {
        final Function function = new Function(FUNC_UPGRADE_INTERFACE_VERSION,
                List.of(),
                List.of(new TypeReference<Utf8String>() {
                }));
        return executeRemoteCallSingleValueReturn(function, String.class);
    }

    public RemoteFunctionCall<Tuple3<BigInteger, BigInteger, Boolean>> authorizedTransactions(BigInteger param0) {
        final Function function = new Function(FUNC_AUTHORIZEDTRANSACTIONS,
                List.of(new Uint256(param0)),
                Arrays.asList(new TypeReference<Uint256>() {
                }, new TypeReference<Uint128>() {
                }, new TypeReference<Bool>() {
                }));
        return new RemoteFunctionCall<Tuple3<BigInteger, BigInteger, Boolean>>(function,
                new Callable<Tuple3<BigInteger, BigInteger, Boolean>>() {
                    @Override
                    public Tuple3<BigInteger, BigInteger, Boolean> call() throws Exception {
                        List<Type> results = executeCallMultipleValueReturn(function);
                        return new Tuple3<BigInteger, BigInteger, Boolean>(
                                (BigInteger) results.get(0).getValue(),
                                (BigInteger) results.get(1).getValue(),
                                (Boolean) results.get(2).getValue());
                    }
                });
    }

    public RemoteFunctionCall<BigInteger> availableForDebtPayment() {
        final Function function = new Function(FUNC_AVAILABLEFORDEBTPAYMENT,
                List.of(),
                List.of(new TypeReference<Uint256>() {
                }));
        return executeRemoteCallSingleValueReturn(function, BigInteger.class);
    }

    public RemoteFunctionCall<BigInteger> availableForPayment() {
        final Function function = new Function(FUNC_AVAILABLEFORPAYMENT,
                List.of(),
                List.of(new TypeReference<Uint256>() {
                }));
        return executeRemoteCallSingleValueReturn(function, BigInteger.class);
    }

    public RemoteFunctionCall<BigInteger> availableForWithdrawal() {
        final Function function = new Function(FUNC_AVAILABLEFORWITHDRAWAL,
                List.of(),
                List.of(new TypeReference<Uint256>() {
                }));
        return executeRemoteCallSingleValueReturn(function, BigInteger.class);
    }

    public RemoteFunctionCall<BigInteger> blockedAmount() {
        final Function function = new Function(FUNC_BLOCKEDAMOUNT,
                List.of(),
                List.of(new TypeReference<Uint256>() {
                }));
        return executeRemoteCallSingleValueReturn(function, BigInteger.class);
    }

    public RemoteFunctionCall<TransactionReceipt> cancelWithdrawal() {
        final Function function = new Function(
                FUNC_CANCELWITHDRAWAL,
                List.of(),
                Collections.emptyList());
        return executeRemoteCallTransaction(function);
    }

    public RemoteFunctionCall<Tuple3<CardWithOtp, CardWithOtp, BigInteger>> cardWithOtp() {
        final Function function = new Function(FUNC_CARDWITHOTP,
                List.of(),
                Arrays.asList(new TypeReference<CardWithOtp>() {
                }, new TypeReference<CardWithOtp>() {
                }, new TypeReference<Uint256>() {
                }));
        return new RemoteFunctionCall<Tuple3<CardWithOtp, CardWithOtp, BigInteger>>(function,
                new Callable<Tuple3<CardWithOtp, CardWithOtp, BigInteger>>() {
                    @Override
                    public Tuple3<CardWithOtp, CardWithOtp, BigInteger> call() throws Exception {
                        List<Type> results = executeCallMultipleValueReturn(function);
                        return new Tuple3<CardWithOtp, CardWithOtp, BigInteger>(
                                (CardWithOtp) results.get(0),
                                (CardWithOtp) results.get(1),
                                (BigInteger) results.get(2).getValue());
                    }
                });
    }

    public RemoteFunctionCall<BigInteger> debtAmount() {
        final Function function = new Function(FUNC_DEBTAMOUNT,
                List.of(),
                List.of(new TypeReference<Uint256>() {
                }));
        return executeRemoteCallSingleValueReturn(function, BigInteger.class);
    }

    public RemoteFunctionCall<Tuple7<byte[], String, String, BigInteger, String, byte[], List<BigInteger>>> eip712Domain() {
        final Function function = new Function(FUNC_EIP712DOMAIN,
                List.of(),
                Arrays.asList(new TypeReference<Bytes1>() {
                }, new TypeReference<Utf8String>() {
                }, new TypeReference<Utf8String>() {
                }, new TypeReference<Uint256>() {
                }, new TypeReference<Address>() {
                }, new TypeReference<Bytes32>() {
                }, new TypeReference<DynamicArray<Uint256>>() {
                }));
        return new RemoteFunctionCall<Tuple7<byte[], String, String, BigInteger, String, byte[], List<BigInteger>>>(function,
                new Callable<Tuple7<byte[], String, String, BigInteger, String, byte[], List<BigInteger>>>() {
                    @Override
                    public Tuple7<byte[], String, String, BigInteger, String, byte[], List<BigInteger>> call() throws Exception {
                        List<Type> results = executeCallMultipleValueReturn(function);
                        return new Tuple7<byte[], String, String, BigInteger, String, byte[], List<BigInteger>>(
                                (byte[]) results.get(0).getValue(),
                                (String) results.get(1).getValue(),
                                (String) results.get(2).getValue(),
                                (BigInteger) results.get(3).getValue(),
                                (String) results.get(4).getValue(),
                                (byte[]) results.get(5).getValue(),
                                convertToNative((List<Uint256>) results.get(6).getValue()));
                    }
                });
    }

    public RemoteFunctionCall<String> factory() {
        final Function function = new Function(FUNC_FACTORY,
                List.of(),
                List.of(new TypeReference<Address>() {
                }));
        return executeRemoteCallSingleValueReturn(function, String.class);
    }

    public RemoteFunctionCall<TransactionReceipt> increaseVerifiedBalance(BigInteger increase) {
        final Function function = new Function(
                FUNC_INCREASEVERIFIEDBALANCE,
                List.of(new Uint256(increase)),
                Collections.emptyList());
        return executeRemoteCallTransaction(function);
    }

    public RemoteFunctionCall<TransactionReceipt> initWithdrawal(BigInteger amount) {
        final Function function = new Function(
                FUNC_INITWITHDRAWAL,
                List.of(new Uint256(amount)),
                Collections.emptyList());
        return executeRemoteCallTransaction(function);
    }

    public RemoteFunctionCall<TransactionReceipt> initialize(String owner_, String registry_, BigInteger singleTransactionLimit, BigInteger spendLimit, BigInteger noOtpSpendLimit, BigInteger spendLimitsPeriod) {
        final Function function = new Function(
                FUNC_INITIALIZE,
                Arrays.asList(new Address(160, owner_),
                        new Address(160, registry_),
                        new Uint256(singleTransactionLimit),
                        new Uint256(spendLimit),
                        new Uint256(noOtpSpendLimit),
                        new Uint256(spendLimitsPeriod)),
                Collections.emptyList());
        return executeRemoteCallTransaction(function);
    }

    public RemoteFunctionCall<Boolean> isTrustedForwarder(String forwarder) {
        final Function function = new Function(FUNC_ISTRUSTEDFORWARDER,
                List.of(new Address(160, forwarder)),
                List.of(new TypeReference<Bool>() {
                }));
        return executeRemoteCallSingleValueReturn(function, Boolean.class);
    }

    public RemoteFunctionCall<Boolean> isWithdrawalInProgress() {
        final Function function = new Function(FUNC_ISWITHDRAWALINPROGRESS,
                List.of(),
                List.of(new TypeReference<Bool>() {
                }));
        return executeRemoteCallSingleValueReturn(function, Boolean.class);
    }

    public RemoteFunctionCall<Boolean> isWithdrawalReady() {
        final Function function = new Function(FUNC_ISWITHDRAWALREADY,
                List.of(),
                List.of(new TypeReference<Bool>() {
                }));
        return executeRemoteCallSingleValueReturn(function, Boolean.class);
    }

    public RemoteFunctionCall<Tuple3<Limits, Limits, BigInteger>> limits() {
        final Function function = new Function(FUNC_LIMITS,
                List.of(),
                Arrays.asList(new TypeReference<Limits>() {
                }, new TypeReference<Limits>() {
                }, new TypeReference<Uint256>() {
                }));
        return new RemoteFunctionCall<Tuple3<Limits, Limits, BigInteger>>(function,
                new Callable<Tuple3<Limits, Limits, BigInteger>>() {
                    @Override
                    public Tuple3<Limits, Limits, BigInteger> call() throws Exception {
                        List<Type> results = executeCallMultipleValueReturn(function);
                        return new Tuple3<Limits, Limits, BigInteger>(
                                (Limits) results.get(0),
                                (Limits) results.get(1),
                                (BigInteger) results.get(2).getValue());
                    }
                });
    }

    public RemoteFunctionCall<String> owner() {
        final Function function = new Function(FUNC_OWNER,
                List.of(),
                List.of(new TypeReference<Address>() {
                }));
        return executeRemoteCallSingleValueReturn(function, String.class);
    }

    public RemoteFunctionCall<BigInteger> ownershipAcceptanceNonce() {
        final Function function = new Function(FUNC_OWNERSHIPACCEPTANCENONCE,
                List.of(),
                List.of(new TypeReference<Uint256>() {
                }));
        return executeRemoteCallSingleValueReturn(function, BigInteger.class);
    }

    public RemoteFunctionCall<String> paymentToken() {
        final Function function = new Function(FUNC_PAYMENTTOKEN,
                List.of(),
                List.of(new TypeReference<Address>() {
                }));
        return executeRemoteCallSingleValueReturn(function, String.class);
    }

    public RemoteFunctionCall<BigInteger> pendingRefundAmount(BigInteger transactionId) {
        final Function function = new Function(FUNC_PENDINGREFUNDAMOUNT,
                List.of(new Uint256(transactionId)),
                List.of(new TypeReference<Uint256>() {
                }));
        return executeRemoteCallSingleValueReturn(function, BigInteger.class);
    }

    public RemoteFunctionCall<BigInteger> pendingRefundTotal() {
        final Function function = new Function(FUNC_PENDINGREFUNDTOTAL,
                List.of(),
                List.of(new TypeReference<Uint256>() {
                }));
        return executeRemoteCallSingleValueReturn(function, BigInteger.class);
    }

    public RemoteFunctionCall<TransactionReceipt> processAuthorization(BigInteger transactionId, BigInteger amount, byte[] otp, BigInteger otpCounter, Boolean forced) {
        final Function function = new Function(
                FUNC_PROCESSAUTHORIZATION,
                Arrays.asList(new Uint256(transactionId),
                        new Uint256(amount),
                        new Bytes16(otp),
                        new Uint16(otpCounter),
                        new Bool(forced)),
                Collections.emptyList());
        return executeRemoteCallTransaction(function);
    }

    public RemoteFunctionCall<TransactionReceipt> processAuthorizationChange(BigInteger transactionId, BigInteger newAmount) {
        final Function function = new Function(
                FUNC_PROCESSAUTHORIZATIONCHANGE,
                Arrays.asList(new Uint256(transactionId),
                        new Uint256(newAmount)),
                Collections.emptyList());
        return executeRemoteCallTransaction(function);
    }

    public RemoteFunctionCall<TransactionReceipt> processAuthorizationNoOtp(BigInteger transactionId, BigInteger amount, Boolean forced) {
        final Function function = new Function(
                FUNC_PROCESSAUTHORIZATIONNOOTP,
                Arrays.asList(new Uint256(transactionId),
                        new Uint256(amount),
                        new Bool(forced)),
                Collections.emptyList());
        return executeRemoteCallTransaction(function);
    }

    public RemoteFunctionCall<TransactionReceipt> processDebt(BigInteger amount) {
        final Function function = new Function(
                FUNC_PROCESSDEBT,
                List.of(new Uint256(amount)),
                Collections.emptyList());
        return executeRemoteCallTransaction(function);
    }

    public RemoteFunctionCall<TransactionReceipt> processPendingRefundPayment(BigInteger transactionId) {
        final Function function = new Function(
                FUNC_PROCESSPENDINGREFUNDPAYMENT,
                List.of(new Uint256(transactionId)),
                Collections.emptyList());
        return executeRemoteCallTransaction(function);
    }

    public RemoteFunctionCall<TransactionReceipt> processRefundPayment(BigInteger transactionId) {
        final Function function = new Function(
                FUNC_PROCESSREFUNDPAYMENT,
                List.of(new Uint256(transactionId)),
                Collections.emptyList());
        return executeRemoteCallTransaction(function);
    }

    public RemoteFunctionCall<TransactionReceipt> processSettlement(BigInteger transactionId, BigInteger amount) {
        final Function function = new Function(
                FUNC_PROCESSSETTLEMENT,
                Arrays.asList(new Uint256(transactionId),
                        new Uint256(amount)),
                Collections.emptyList());
        return executeRemoteCallTransaction(function);
    }

    public RemoteFunctionCall<TransactionReceipt> processWithdrawal(String to) {
        final Function function = new Function(
                FUNC_PROCESSWITHDRAWAL,
                List.of(new Address(160, to)),
                Collections.emptyList());
        return executeRemoteCallTransaction(function);
    }

    public RemoteFunctionCall<String> processor() {
        final Function function = new Function(FUNC_PROCESSOR,
                List.of(),
                List.of(new TypeReference<Address>() {
                }));
        return executeRemoteCallSingleValueReturn(function, String.class);
    }

    public RemoteFunctionCall<byte[]> proxiableUUID() {
        final Function function = new Function(FUNC_PROXIABLEUUID,
                List.of(),
                List.of(new TypeReference<Bytes32>() {
                }));
        return executeRemoteCallSingleValueReturn(function, byte[].class);
    }

    public RemoteFunctionCall<String> registry() {
        final Function function = new Function(FUNC_REGISTRY,
                List.of(),
                List.of(new TypeReference<Address>() {
                }));
        return executeRemoteCallSingleValueReturn(function, String.class);
    }

    public RemoteFunctionCall<TransactionReceipt> savePendingRefund(BigInteger transactionId, BigInteger amount) {
        final Function function = new Function(
                FUNC_SAVEPENDINGREFUND,
                Arrays.asList(new Uint256(transactionId),
                        new Uint256(amount)),
                Collections.emptyList());
        return executeRemoteCallTransaction(function);
    }

    public RemoteFunctionCall<BigInteger> securityDelay() {
        final Function function = new Function(FUNC_SECURITYDELAY,
                List.of(),
                List.of(new TypeReference<Uint256>() {
                }));
        return executeRemoteCallSingleValueReturn(function, BigInteger.class);
    }

    public RemoteFunctionCall<TransactionReceipt> setCard(String card, byte[] otpRoot, BigInteger otpCounter, byte[] ownershipAcceptanceSignature) {
        final Function function = new Function(
                FUNC_SETCARD,
                Arrays.asList(new Address(160, card),
                        new Bytes16(otpRoot),
                        new Uint16(otpCounter),
                        new org.web3j.abi.datatypes.DynamicBytes(ownershipAcceptanceSignature)),
                Collections.emptyList());
        return executeRemoteCallTransaction(function);
    }

    public RemoteFunctionCall<TransactionReceipt> setLimits(BigInteger singleTransactionLimit, BigInteger spendLimit, BigInteger noOtpSpendLimit, BigInteger spendLimitsPeriod) {
        final Function function = new Function(
                FUNC_SETLIMITS,
                Arrays.asList(new Uint256(singleTransactionLimit),
                        new Uint256(spendLimit),
                        new Uint256(noOtpSpendLimit),
                        new Uint256(spendLimitsPeriod)),
                Collections.emptyList());
        return executeRemoteCallTransaction(function);
    }

    public RemoteFunctionCall<TransactionReceipt> setOtpState(byte[] otp, BigInteger counter) {
        final Function function = new Function(
                FUNC_SETOTPSTATE,
                Arrays.asList(new Bytes16(otp),
                        new Uint16(counter)),
                Collections.emptyList());
        return executeRemoteCallTransaction(function);
    }

    public RemoteFunctionCall<TransactionReceipt> setOwner(String owner_, byte[] ownershipAcceptanceSignature) {
        final Function function = new Function(
                FUNC_SETOWNER,
                Arrays.asList(new Address(160, owner_),
                        new org.web3j.abi.datatypes.DynamicBytes(ownershipAcceptanceSignature)),
                Collections.emptyList());
        return executeRemoteCallTransaction(function);
    }

    public RemoteFunctionCall<TransactionReceipt> setProcessor(String processor_) {
        final Function function = new Function(
                FUNC_SETPROCESSOR,
                List.of(new Address(160, processor_)),
                Collections.emptyList());
        return executeRemoteCallTransaction(function);
    }

    public RemoteFunctionCall<TransactionReceipt> setVerifiedBalance(BigInteger verifiedBalance_) {
        final Function function = new Function(
                FUNC_SETVERIFIEDBALANCE,
                List.of(new Uint256(verifiedBalance_)),
                Collections.emptyList());
        return executeRemoteCallTransaction(function);
    }

    public RemoteFunctionCall<BigInteger> settlementPeriod() {
        final Function function = new Function(FUNC_SETTLEMENTPERIOD,
                List.of(),
                List.of(new TypeReference<Uint256>() {
                }));
        return executeRemoteCallSingleValueReturn(function, BigInteger.class);
    }

    public RemoteFunctionCall<String> trustedForwarder() {
        final Function function = new Function(FUNC_TRUSTEDFORWARDER,
                List.of(),
                List.of(new TypeReference<Address>() {
                }));
        return executeRemoteCallSingleValueReturn(function, String.class);
    }

    public RemoteFunctionCall<TransactionReceipt> unblockUnsettledTransaction(BigInteger transactionId) {
        final Function function = new Function(
                FUNC_UNBLOCKUNSETTLEDTRANSACTION,
                List.of(new Uint256(transactionId)),
                Collections.emptyList());
        return executeRemoteCallTransaction(function);
    }

    public RemoteFunctionCall<TransactionReceipt> upgradeToAndCall(String newImplementation, byte[] data, BigInteger weiValue) {
        final Function function = new Function(
                FUNC_UPGRADETOANDCALL,
                Arrays.asList(new Address(160, newImplementation),
                        new org.web3j.abi.datatypes.DynamicBytes(data)),
                Collections.emptyList());
        return executeRemoteCallTransaction(function, weiValue);
    }

    public RemoteFunctionCall<BigInteger> verifiedBalance() {
        final Function function = new Function(FUNC_VERIFIEDBALANCE,
                List.of(),
                List.of(new TypeReference<Uint256>() {
                }));
        return executeRemoteCallSingleValueReturn(function, BigInteger.class);
    }

    public RemoteFunctionCall<BigInteger> withdrawalAmount() {
        final Function function = new Function(FUNC_WITHDRAWALAMOUNT,
                List.of(),
                List.of(new TypeReference<Uint256>() {
                }));
        return executeRemoteCallSingleValueReturn(function, BigInteger.class);
    }

    public RemoteFunctionCall<BigInteger> withdrawalReadyTimestamp() {
        final Function function = new Function(FUNC_WITHDRAWALREADYTIMESTAMP,
                List.of(),
                List.of(new TypeReference<Uint256>() {
                }));
        return executeRemoteCallSingleValueReturn(function, BigInteger.class);
    }

    public RemoteFunctionCall<TransactionReceipt> writeOffDebt(BigInteger amount) {
        final Function function = new Function(
                FUNC_WRITEOFFDEBT,
                List.of(new Uint256(amount)),
                Collections.emptyList());
        return executeRemoteCallTransaction(function);
    }

    public static class OtpState extends StaticStruct {
        public byte[] otp;

        public BigInteger counter;

        public OtpState(byte[] otp, BigInteger counter) {
            super(new Bytes16(otp),
                    new Uint16(counter));
            this.otp = otp;
            this.counter = counter;
        }

        public OtpState(Bytes16 otp, Uint16 counter) {
            super(otp, counter);
            this.otp = otp.getValue();
            this.counter = counter.getValue();
        }
    }

    public static class Limit extends StaticStruct {
        public BigInteger _00_limit;

        public BigInteger _01_spent;

        public Limit(BigInteger limit, BigInteger spent) {
            super(new Uint256(limit),
                    new Uint256(spent));
            this._00_limit = limit;
            this._01_spent = spent;
        }

        public Limit(Uint256 limit, Uint256 spent) {
            super(limit, spent);
            this._00_limit = limit.getValue();
            this._01_spent = spent.getValue();
        }
    }

    public static class Timer extends StaticStruct {
        public BigInteger expireTimestamp;

        public Timer(BigInteger expireTimestamp) {
            super(new Uint256(expireTimestamp));
            this.expireTimestamp = expireTimestamp;
        }

        public Timer(Uint256 expireTimestamp) {
            super(expireTimestamp);
            this.expireTimestamp = expireTimestamp.getValue();
        }
    }

    public static class CardWithOtp extends StaticStruct {
        public String card;

        public OtpState otpState;

        public CardWithOtp(String card, OtpState otpState) {
            super(new Address(160, card),
                    otpState);
            this.card = card;
            this.otpState = otpState;
        }

        public CardWithOtp(Address card, OtpState otpState) {
            super(card, otpState);
            this.card = card.getValue();
            this.otpState = otpState;
        }
    }

    public static class Limits extends StaticStruct {
        public BigInteger _00_singleTransactionLimit;

        public Limit _01_spendLimit;

        public Limit _02_noOtpSpendLimit;

        public Timer _03_spendLimitsTimer;

        public BigInteger _04_spendLimitsPeriod;

        public Limits(BigInteger singleTransactionLimit, Limit spendLimit, Limit noOtpSpendLimit, Timer spendLimitsTimer, BigInteger spendLimitsPeriod) {
            super(new Uint256(singleTransactionLimit),
                    spendLimit,
                    noOtpSpendLimit,
                    spendLimitsTimer, 
                    new Uint256(spendLimitsPeriod));
            this._00_singleTransactionLimit = singleTransactionLimit;
            this._01_spendLimit = spendLimit;
            this._02_noOtpSpendLimit = noOtpSpendLimit;
            this._03_spendLimitsTimer = spendLimitsTimer;
            this._04_spendLimitsPeriod = spendLimitsPeriod;
        }

        public Limits(Uint256 singleTransactionLimit, Limit spendLimit, Limit noOtpSpendLimit, Timer spendLimitsTimer, Uint256 spendLimitsPeriod) {
            super(singleTransactionLimit, spendLimit, noOtpSpendLimit, spendLimitsTimer, spendLimitsPeriod);
            this._00_singleTransactionLimit = singleTransactionLimit.getValue();
            this._01_spendLimit = spendLimit;
            this._02_noOtpSpendLimit = noOtpSpendLimit;
            this._03_spendLimitsTimer = spendLimitsTimer;
            this._04_spendLimitsPeriod = spendLimitsPeriod.getValue();
        }
    }

    public static class AccountStateAfterSettlementEventResponse extends BaseEventResponse {
        public BigInteger balance;

        public BigInteger blockedAmount;

        public BigInteger debtTotal;

        public BigInteger pendingRefundTotal;
    }

    public static class CardSetEventResponse extends BaseEventResponse {
        public String card;

        public byte[] otpRoot;

        public BigInteger otpCounter;
    }

    public static class DebtIncreasedEventResponse extends BaseEventResponse {
        public BigInteger increase;

        public BigInteger debtAmount;
    }

    public static class DebtPaidEventResponse extends BaseEventResponse {
        public BigInteger paid;

        public BigInteger debtLeft;
    }

    public static class DebtWrittenOffEventResponse extends BaseEventResponse {
        public BigInteger writtenOff;

        public BigInteger debtLeft;
    }

    public static class EIP712DomainChangedEventResponse extends BaseEventResponse {
    }

    public static class InitializedEventResponse extends BaseEventResponse {
        public BigInteger version;
    }

    public static class InsufficientFundsOnForcedAuthEventResponse extends BaseEventResponse {
        public BigInteger transactionId;

        public BigInteger insufficientAmount;
    }

    public static class LimitsSetEventResponse extends BaseEventResponse {
        public BigInteger singleTransactionLimit;

        public BigInteger spendLimit;

        public BigInteger noOtpSpendLimit;

        public BigInteger spendLimitsPeriod;
    }

    public static class NoOtpTransactionAuthorizedEventResponse extends BaseEventResponse {
        public BigInteger transactionId;

        public BigInteger amount;
    }

    public static class OtpStateSetEventResponse extends BaseEventResponse {
        public byte[] otpRoot;

        public BigInteger otpCounter;
    }

    public static class OwnerSetEventResponse extends BaseEventResponse {
        public String owner;
    }

    public static class PendingRefundSavedEventResponse extends BaseEventResponse {
        public BigInteger transactionId;

        public BigInteger amount;
    }

    public static class ProcessorSetEventResponse extends BaseEventResponse {
        public String processor;

        public String paymentToken;
    }

    public static class RefundPaidEventResponse extends BaseEventResponse {
        public BigInteger transactionId;

        public BigInteger amount;
    }

    public static class TransactionAmountChangedEventResponse extends BaseEventResponse {
        public BigInteger transactionId;

        public BigInteger newAmount;
    }

    public static class TransactionAuthorizedEventResponse extends BaseEventResponse {
        public BigInteger transactionId;

        public BigInteger amount;

        public byte[] otp;

        public BigInteger otpCounter;
    }

    public static class TransactionSettledEventResponse extends BaseEventResponse {
        public BigInteger transactionId;

        public BigInteger settlementAmount;

        public BigInteger paymentAmount;
    }

    public static class UnsettledTransactionUnblockedEventResponse extends BaseEventResponse {
        public BigInteger transactionId;

        public BigInteger amount;
    }

    public static class UpgradedEventResponse extends BaseEventResponse {
        public String implementation;
    }

    public static class VerifiedBalanceIncreasedEventResponse extends BaseEventResponse {
        public BigInteger increase;

        public BigInteger verifiedBalance;
    }

    public static class VerifiedBalanceSetEventResponse extends BaseEventResponse {
        public BigInteger verifiedBalance;
    }

    public static class WithdrawalCanceledEventResponse extends BaseEventResponse {
    }

    public static class WithdrawalCompleteEventResponse extends BaseEventResponse {
        public String to;

        public BigInteger amount;
    }

    public static class WithdrawalInitiatedEventResponse extends BaseEventResponse {
        public BigInteger amount;

        public BigInteger readyToWithdrawTimestamp;
    }
}
